博客
关于我
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灵魂16问,你能撑到第几问?
查看>>
MySQL灵魂拷问:36题带你面试通关
查看>>
mysql状态分析之show global status
查看>>
mysql状态查看 QPS/TPS/缓存命中率查看
查看>>
mysql生成树形数据_mysql 实现树形的遍历
查看>>
mysql用于检索的关键字_Mysql全文搜索match...against的用法
查看>>
MySQL用得好好的,为什么要转ES?
查看>>
MySql用户以及权限的管理。
查看>>
MySQL用户权限配置:精细控制和远程访问的艺术!------文章最后有惊喜哦。
查看>>
mysql用户管理、常用语句、数据分备份恢复
查看>>
MySQL留疑问:left join时选on还是where?
查看>>
mysql登陆慢问题解决
查看>>
Mysql百万级数据查询优化
查看>>
MySQL的 DDL和DML和DQL的基本语法
查看>>
mysql的 if else , case when then, IFNULL
查看>>
MySQL的10种常用数据类型
查看>>
MySQL的btree索引和hash索引的区别
查看>>
mysql的cast函数
查看>>
MySql的CRUD(增、删、改、查)操作
查看>>
MySQL的DATE_FORMAT()函数将Date转为字符串
查看>>