博客
关于我
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 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>