【发布时间】:2020-07-24 13:49:56
【问题描述】:
我在以下代码中的 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;
}
});
}
我有点难过,因为这个代码模式似乎是 Strong reference to a weak references inside blocks 中提到的解决方案
这是 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 异常的原因。
【问题讨论】:
-
1.为什么是主线程? -------------------- 2. 被管理对象在增加修订的那一刻是零还是什么?
-
@IlyaMuradymov 以便在主线程上通知属性上的观察者
-
在 LibraryManagedObject() 中重新定义(读写)使其可以从类内部访问,这并没有错,但声明了一个公共方法会增加 objectRevision;并调用它。
-
如果 -(void)increaseObjectRevision 是 LibraryManagedObject 类的一部分,您实际上是在调用一个异步访问只读属性的方法。
-
@OlSen 请查看stackoverflow.com/questions/5008060/…
标签: ios objective-c