objective-c – 启用ARC的设备上的iOS崩溃

objective-c – 启用ARC的设备上的iOS崩溃,第1张

概述我遇到了一个让我完全难过的问题.我将用代码示例说明: @interface Crasher ()@property (nonatomic, strong) NSArray *array;@end@implementation Crasher- (void)crash;{ NSMutableArray *mutable = [NSMutableArray array]; NSA 我遇到了一个让我完全难过的问题.我将用代码示例说明:
@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
解决方法 因为这个问题只发生在设备(ARM代码)和Release版本(优化代码)中,所以我非常怀疑你在Clang编译器的优化器中发现了一个关于ARC和块和自动释放的错误.使用示例项目作为附件在Radar中引发错误.

如果用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崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1241670.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存