博客
关于我
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/

你可能感兴趣的文章
nodejs libararies
查看>>
vue3+element-plus 项目中 el-switch 刷新后自动触发change?坑就藏在这里!
查看>>
nodejs npm常用命令
查看>>
nodejs npm常用命令
查看>>
Nodejs process.nextTick() 使用详解
查看>>
NodeJS yarn 或 npm如何切换淘宝或国外镜像源
查看>>
nodejs 中间件理解
查看>>
nodejs 创建HTTP服务器详解
查看>>
nodejs 发起 GET 请求示例和 POST 请求示例
查看>>
NodeJS 导入导出模块的方法( 代码演示 )
查看>>
nodejs 开发websocket 笔记
查看>>
nodejs 的 Buffer 详解
查看>>
NodeJS 的环境变量: 开发环境vs生产环境
查看>>
nodejs 读取xlsx文件内容
查看>>
nodejs 运行CMD命令
查看>>
Nodejs+Express+Mysql实现简单用户管理增删改查
查看>>
nodejs+nginx获取真实ip
查看>>
nodejs-mime类型
查看>>
NodeJs——(11)控制权转移next
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>