博客
关于我
iOS-常见Crash
阅读量:254 次
发布时间:2019-03-01

本文共 2237 字,大约阅读时间需要 7 分钟。

iOS开发中常见崩溃问题及解决方案

在iOS开发过程中,虽然使用了ARC和现代化的开发框架,但仍然会遇到各种崩溃问题。以下是几种常见的崩溃问题及解决方案,希望能帮助开发者快速定位和修复问题。


1. NSInvalidArgumentException 异常

出现原因:

  • 在创建NSDictionaryNSMutableDictionary时,传入了nil数据。
  • 尤其是在NSDictionary初始化时,若值传入nil,会导致崩溃。

解决方案:

  • 方法一:数据校验

    在返回数据前,对空值进行处理,将nil转换为NSNull。但需谨慎处理特殊业务逻辑中允许的空值。

  • 方法二:代码校验

    在使用NSDictionary时,检查数据是否有效,避免传入nil
    例如:

    if (!key || !value) {    // 处理空值情况}
  • 方法三:利用Runtime

    使用Objective-C的Runtime实现一个安全的NSDictionary类,自动将nil转换为NSNull
    例如:

    + (instancetype)gl_dictionaryWithObjects:(const id *)objects forKeys:(const id *)keys count:(NSUInteger)count {    id safeObjects[count];    id safeKeys[count];    NSUInteger j = 0;    for (NSUInteger i = 0; i < count; i++) {        id key = keys[i];        id obj = objects[i];        if (!key || !obj) {            continue;        }        safeKeys[j] = key;        safeObjects[j] = obj;        j++;    }    return [self gl_dictionaryWithObjects:safeObjects forKeys:safeKeys count:j];}

2. data parameter is nil

出现原因:

  • NSJSONSerialization序列化时,数据datanil,导致崩溃。

解决方案:

  • 在调用NSJSONSerialization之前,检查data是否为nil,如果是,先初始化一个空的数据结构。
    例如:
    if (!data) {    data = [NSData data];}

3. unrecognized selector sent to instance 0x15d23910

出现原因:

  • 调用了一个不存在的方法,通常是因为类的兼容性问题。

解决方案:

  • 在方法实现前,检查调用者的类类型是否正确。
    例如:
    - (void)method {    if ([self isKindOfClass:[SomeClass class]]) {        // 实现具体逻辑    } else {        return;    }}

4. SIGSEGV 异常

出现原因:

  • 访问未被分配的内存或已被释放的内存。
  • 在C语言中,未正确释放内存会导致该问题。

解决方案:

  • 手动释放C语言分配的内存。

    例如:

    void *memory = malloc(...);...free(memory);
  • 避免在ARC中使用C语言分配的内存。


5. Can't add self as subview crash

出现原因:

  • pushpop视图时,设置了animated:YES,但动画未完成时再操作。

解决方案:

  • 设置animated:NO,但这会去除系统动画效果。
    另一种方法是利用Runtime实现安全的视图栈操作,确保不存在同时入栈或出栈的情况。

6. NSRangeException 异常

出现原因:

  • 数组或字符串越界访问。

解决方案:

  • 在访问数组或字符串前,检查索引是否有效。
    例如:
    - (NSInteger)arrayIndex {    if (index < 0 || index >= [array count]) {        return -1; // 或抛出异常    }    return index;}

7. SIGPIPE 异常

出现原因:

  • 写入已关闭的socket。

解决方案:

  • 在iOS中,添加以下代码到.pch文件中:
    #if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)const int value = 1;setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(int));#endif

8. SIGABRT 异常

出现原因:

  • 断言或异步操作失败时触发。

解决方案:

  • 在可能导致异步操作失败的代码中,使用try-catch机制。
    例如:
    @try {    // 可能抛出异常的代码} @catch (NSException *e) {    // 处理异常} @finally {    // 恢复操作}

通过以上方法,开发者可以有效避免常见的崩溃问题,提升应用的稳定性。

转载地址:http://lqvt.baihongyu.com/

你可能感兴趣的文章
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
MySQL Join算法与调优白皮书(二)
查看>>
Mysql order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
mysql replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>