我在以下代码中的 managedObject.objectRevision 访问中收到 EXC_BAD_ACCESS 异常:
-(void)increaseObjectRevision {
__weak LibraryManagedObject* weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
LibraryManagedObject* managedObject = weakSelf;
if(managedObject) {
managedObject.objectRevision = managedObject.objectRevision + 1;
}
});
}
我有点难住,因为这个代码模式似乎是强引用中提到的解决方案块内的弱引用
这是 objectRevision 属性的声明:
@interface LibraryManagedObject : NSObject
@property (readonly, nonatomic) NSUInteger objectRevision;
...
@end
并在 LibraryManagedObject.m 中重新定义为:
@interface LibraryManagedObject()
@property (readwrite, nonatomic, assign) NSUInteger objectRevision;
@end
我在这里缺少什么吗?
注意:我可以使属性原子化,但看到这不是指向 NSNumber 的指针而是值本身,它不应该是 EXC_BAD_ACCESS 异常的原因。
问题中发布的代码按预期工作。对照weakSelf的值检查异常中上报的内存地址,发现地址不同。
在我们的讨论 ( https://chat.stackoverflow.com/rooms/218530/discussion-between-ol-sen-and-ekscrypto ) 中,很明显 KVO 可能实际上与崩溃有关。其中一个 KVO 观察者在被解除分配之前没有正确地取消注册其观察者。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句