对象在中间功能发布时EXC_BAD_ACCESS

时间:2016-10-19 19:58:23

标签: ios objective-c automatic-ref-counting

我有一个属性

的类
@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

1 个答案:

答案 0 :(得分:1)

  MyObject *newObject = [self.externalStore getObject];

该方法不应该被命名为get*任何东西,但这不太可能是问题的原因。也不可能是一个线程问题(至少不是直接问题)。

这听起来更像是某些与copyWithZone:相关的状态未正确处理。复制方法是如何实现的?具体来说,它是正确复制所有状态和碰撞引用计数还是尝试通过执行某种字节副本来作弊?