iOS应用程序有时在取消引用弱引用时崩溃
我有一个非常简单的课程:iOS应用程序有时在取消引用弱引用时崩溃,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,我有一个非常简单的课程: @interface WORef : NSObject @property(nonatomic,weak) NSObject * object; @end 实例存储在NSArray中,并且不时(仅在主线程上)迭代该数组,我访问“object”属性 在测试或调试时,所有这些都可以正常工作,但在应用商店上我的应用程序的生产版本中,在取消引用“object”属性时,有时会收到崩溃报告(堆栈跟踪实际上显示了属性定义的行号) 以下是此类调用堆栈的示例: Thread : Cra
@interface WORef : NSObject
@property(nonatomic,weak) NSObject * object;
@end
实例存储在NSArray中,并且不时(仅在主线程上)迭代该数组,我访问“object”属性
在测试或调试时,所有这些都可以正常工作,但在应用商店上我的应用程序的生产版本中,在取消引用“object”属性时,有时会收到崩溃报告(堆栈跟踪实际上显示了属性定义的行号)
以下是此类调用堆栈的示例:
Thread : Crashed: com.apple.main-thread
0 libsystem_platform.dylib 0x35180518 _os_lock_recursive_abort + 18446744073709552000
1 libsystem_platform.dylib 0x3518050f _os_lock_handoff_lock_slow + 90
2 libobjc.A.dylib 0x34adac3f objc_object::sidetable_release_slow((anonymous namespace)::SideTable*, bool) + 22
3 libobjc.A.dylib 0x34adad2f objc_object::sidetable_release(bool) + 118
4 Foundation 0x27f56f01 -[NSOperationQueue dealloc] + 72
5 libobjc.A.dylib 0x34adad5f objc_object::sidetable_release(bool) + 166
6 libobjc.A.dylib 0x34ac14d9 _class_initialize + 536
7 libobjc.A.dylib 0x34ac705f lookUpImpOrForward + 254
8 libobjc.A.dylib 0x34ac6f1b lookUpImpOrNil + 26
9 libobjc.A.dylib 0x34abfab3 class_getMethodImplementation + 34
10 libobjc.A.dylib 0x34ada583 weak_read_no_lock + 58
11 libobjc.A.dylib 0x34ada871 objc_loadWeakRetained + 92
12 MyApp 0x000c5983 -[WORef object] (WeakRef.m:12)
有人知道这可能是什么原因吗?有时是什么意思?你如何复制这个问题?应用程序通常在某些确定的情况下崩溃,您的情况是什么?您说“堆栈跟踪实际上显示了属性定义的行号”,但您显示的行号在.m文件中。这个对象的声明方式有什么特别之处吗?(你怎么知道物体本身仍然存在呢?)holex,就是这样。我无法复制它。它在生产版本中经常发生,但在调试或特殊构建中从未发生过。它位于m文件中,因为它是一个仅由另一个类私下使用的类,所以接口和实现位于该m文件中。对象本身仍然存在,因为它存储在NSArray中。我猜WORef对象是一个僵尸。如果其指向的对象被破坏,弱引用将设置为nil
// consider this method
-(void)populateArray {
WORef *ref = [WORef new];
ref.object = [YourObject new];
return @[ref];
// once you get out of this scope, the memory space occupied by [YourObject new]
// can be re-allocate to something else and your ref.object would still point at
// that memory space. You would get random crashes depending on when this memory space get re-allocated.
// The reason being is that ref.object hold a weak reference to [YourObject new]
// so it reference count doesn't get incremented.
// Change your property declaration to (nonatomic,strong) instead
}