大佬教程收集整理的这篇文章主要介绍了objective-c – 启用ARC的设备上的iOS崩溃,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@interface Crasher () @property (nonatomic,strong) NSArray *array; @end @implementation Crasher - (void)crash; { NSMutableArray *mutable = [NSMutableArray array]; NSArray *items = @[@0,@1,@2,@3]; if ([@YES boolValue]) { [items enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop) { [mutable addObject:obj]; }]; } else { [items enumerateObjectsUsingBlock:^(id obj,BOOL *stop) { [mutable addObject:obj]; }]; } [self setArray:mutable]; } @end
当启用ARC并在设备上运行时,上面的代码在[self setArray:mutable]行崩溃.代码永远不会在模拟器上崩溃,也不会在禁用ARC的设备上崩溃.使用NSZombieEnabled表示setter正在尝试保留已经解除分配的数组.
如果第二个[mutable addObject:obj]调用被注释掉,它不会崩溃(但这个代码从未在第一个地方执行).
我上传了一个项目,向Github演示了这次崩溃到aidansteele/arc-crash
.我正在使用Xcode 4.5.2.它似乎不会出现在Xcode 4.6上,但仍然在开发人员预览中.我究竟做错了什么?
解决this的答案(在问题上,以便我有更多的空间),我不相信问题在于 – [NSArray enumerateObjectsUsingBlock:]因为如果我改变该方法调用以使用以下问题仍然存在 – [NSArray(功能)每个:]召唤.
@interface NSArray (Functional) - (void)each:(void (^)(id obj))action; @end @implementation NSArray (Functional) - (void)each:(void (^)(id))action; { for (NSUInteger idx = 0; idx < [self count]; idx++) { action([self objectATindex:idx]); } } @end
如果用en替换enumerateObjectsUsingBlock
for (id n in items) { [mutable addObject:n]; }
你崩溃会消失.
解决问题的代码的其他更改:
更换:
[NSMutableArray array];
同
[NSMutableArray new];
要么
[[NSMutableArray alloc] init];
另外,另外,您不应该在NSArray属性中存储NSMutableArray.在将NSMutableArray分配给属性之前,您应该将NSMutableArray转换为NSArray.例如:
self.array = [NSArray arrayWithArray:mutable];
请注意,这不会解决崩溃问题.这只是更好的代码.
希望这可以帮助.
以上是大佬教程为你收集整理的objective-c – 启用ARC的设备上的iOS崩溃全部内容,希望文章能够帮你解决objective-c – 启用ARC的设备上的iOS崩溃所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。