iOS 如何在ARC下 使用MRC的类库

本文指导如何在MRC工程中实现ARC编译,通过修改工程设置来选择性地应用ARC,确保代码的现代性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何在ARC使用MRC的类库:

如果你的工程是MRC,想让某些使用ARC进行编译的话那么需要选中工程在Build Parses 找到Complile Sources把该类后面写上如下命令: -fobjec-arc.

反之写上如下命令:-fon-objc-arc


### iOS 开发中返回值为 `null` 的原因分析 在 iOS 开发过程中,当函数或方法的返回值为 `null` 或者解析 JSON 数据时出现 `[NSNull length]: unrecognized selector sent to instance` 错误,通常是因为数据源中的某些字段被标记为了 `NSNull` 类型[^3]。这种情况下,程序尝试调用不存在的方法(如 `length` 或 `count`),从而引发崩溃。 以下是可能的原因以及对应的解决方案: --- #### 原因一:JSON 数据中存在 NSNull 字段 在处理来自服务器端的 JSON 数据时,如果某个键对应的数据为空,服务端可能会将其设置为 `null`。而在 Objective-C 中,`null` 被映射为 `NSNull` 对象。因此,在访问这些字段时如果没有进行类型判断,则会触发上述错误。 ##### 解决方案: 在解析 JSON 数据之前,先检查字段是否为 `NSNull` 并对其进行特殊处理。例如: ```objc id value = jsonObject[@"key"]; if (value == [NSNull null]) { value = @""; // 将其替换为默认值或其他逻辑处理 } NSString *stringValue = (NSString *)value; ``` 通过这种方式可以有效避免直接对 `NSNull` 发送不支持的消息。 --- #### 原因二:内存管理问题导致的对象释放 另一个可能导致返回 `null` 的原因是内存管理不当。尤其是在手动引用计数模式下(MRC),未正确保留对象或者过早释放对象都可能导致后续操作获取到已销毁实例的结果——即表现为 `null` 或其他异常行为[^1]。 ##### 解决方案: 确保遵循正确的所有权语法规则来管理对象生命周期;对于 ARC(Automatic Reference Counting),确认没有意外断开强引用链路的情况发生。同时也可以利用 Instruments 工具检测潜在泄漏点与悬空指针问题。 --- #### 原因三:接口设计差异引起冲突 有时 API 定义与其实际实现之间可能存在矛盾之处,比如声明了一个特定类型的返回值却最终给出了不同的结果(如上面提到的例子)。这不仅限于自定义类库内部也可能存在于第三方框架集成场景之中。 ##### 解决方案: 仔细核对接口文档说明并与真实运行表现对比找出不符之处加以修正调整。必要时候联系供应商获得最新版更新修复此类 bug 。 --- ### 总结代码片段示范 下面给出一段综合考虑以上各点后的安全取值方式样例: ```objc NSDictionary *jsonObject = ... ;//假设这是从网络请求得到并成功转换成字典形式的数据结构 for (NSString *key in jsonObject) { id value = jsonObject[key]; if ([value isKindOfClass:[NSNull class]]) { NSLog(@"%@ is Null", key); continue;//跳过该条目不做进一步处理 } if (![value respondsToSelector:@selector(length)]){ //这里可以根据具体需求扩展更多兼容性验证条件 NSLog(@"%@ does not support method 'length'", key); continue ; } NSString* safeString=(NSString*)value; NSLog(@"Key:%@ has Length:%lu ",key,(unsigned long)[safeString length]); } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值