我有一个属性
的类@property (nonatomic, copy) MyObject *currentObject;
和一个看起来像这样的函数:
- (void)handleExternalChange {
@synchronized (self) {
MyObject *newObject = [self.externalStore getObject];
//Business logic...
self.currentObject = newObject;
}
}
当我点击objc_msgSend() selector name: copyWithZone:
行时,我偶尔会看到崩溃self.currentObject = newObject
。
我认为这是因为externalStore
在另一个线程上释放了getObject
返回的对象,当它到达setter时它就消失了。
这个结论是否正确?如果是这样,有推荐的解决方法吗?
更新:
这是一些堆栈跟踪
Application Specific Information:
objc_msgSend() selector name: copyWithZone:
0 libobjc.A.dylib 0x000000018149ef30 objc_msgSend + 16
1 libobjc.A.dylib 0x000000018149c2d4 objc_setProperty_nonatomic_copy + 44
2 MyApp 0x0000000100115cb4 -[MyClass handleExternalChange] (MyClass.m:117)
3 CoreFoundation 0x00000001829ee22c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 16
4 CoreFoundation 0x00000001829ed930 _CFXRegistrationPost + 396
5 CoreFoundation 0x00000001829ed6ac ___CFXNotificationPost_block_invoke + 56
6 CoreFoundation 0x0000000182a5cb9c -[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1500
7 CoreFoundation 0x000000018292fbf4 _CFXNotificationPost + 372
8 Foundation 0x00000001834366bc -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
答案 0 :(得分:1)
MyObject *newObject = [self.externalStore getObject];
该方法不应该被命名为get*
任何东西,但这不太可能是问题的原因。也不可能是一个线程问题(至少不是直接问题)。
这听起来更像是某些与copyWithZone:
相关的状态未正确处理。复制方法是如何实现的?具体来说,它是正确复制所有状态和碰撞引用计数还是尝试通过执行某种字节副本来作弊?