关于NSMutableArray 调用 addObject 方法崩溃

对于NSMutableArray类调用addObject方法实现向可变数组中写入数据是比较常用的,今天我在一个项目中调用此方法时却引起了程序的crash,于是我通过全局断点将crash原因定位到图中浅绿色一行:


其中定义变量如下:

[objc]  view plain  copy
  1. @property(nonatomic,copy)NSMutableArray *documentListArray;  


后来经过查阅资料和请教他人得知: copy关键字在修饰除OC某些基础类型(如NSString)外的类型时,需要重写NSOject类方法:

[objc]  view plain  copy
  1. + (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;  


否则调用时会导致数据异常引起崩溃.

所以此处解决方法有二:

1.重写copyWithZone方法返回新的对象.
2.将copy关键字换成strong关键字实现强引用即可,如下:

[objc]  view plain  copy
  1. @property(nonatomic,strong)NSMutableArray *documentListArray;  


再编译时,便不会再有问题了.


### NSInvalidArgumentException 原因分析 `NSInvalidArgumentException` 是一种常见的运行时异常,在 Objective-C 和 Swift 的 iOS 或 macOS 应用程序开发中经常遇到。当尝试调用某个方法或初始化器时传递了不合法的参数,就会抛出此异常。 对于 `__NSPlaceholderDictionary initWithObjects:forKeys:count:` 报错的情况,通常是因为传入了一个非法值(如 `nil`)。具体来说: - 当使用 `[NSDictionary dictionaryWithObjects:objects forKeys:keys count:count]` 初始化字典时,如果数组中的任何一个键或者值为 `nil`,都会触发 `NSInvalidArgumentException`[^1]。 #### 解决方案 为了避免此类错误发生,可以采取以下措施: 1. **验证输入数据**:在创建字典之前检查所有的键和值是否都有效且非空。 2. **过滤掉无效项**:可以通过循环或其他逻辑手段移除可能存在的 `nil` 键或值后再执行初始化操作。 以下是实现这些策略的一个例子代码片段: ```objective-c NSMutableArray *filteredKeys = [NSMutableArray array]; NSMutableArray *filteredValues = [NSMutableArray array]; for (int i=0;i<keyCount;i++) { id key = keys[i]; id obj = objects[i]; if(key && obj){ [filteredKeys addObject:key]; [filteredValues addObject:obj]; } } NSMutableDictionary *safeDict = [NSMutableDictionary dictionaryWithObjects:[filteredValues copy] forKeys:[filteredKeys copy]]; ``` 这段代码会先筛选掉任何可能导致崩溃的 `nil` 条目,从而安全地构建字典[^4]。 ### 进一步说明 除了上述提到的具体情况外,还有其他一些场景也可能引发类似的异常问题,比如试图访问不存在的对象属性或是调用了未定义的方法等。因此,在日常编码过程中保持良好的编程习惯非常重要——始终确认所使用的变量已被正确定义并赋初值;另外合理利用断言机制也可以帮助开发者尽早发现潜在隐患[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值