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 
 }