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

你可能感兴趣的文章
logstash mysql 准实时同步到 elasticsearch
查看>>
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现&lt; 以及&gt; 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>