首页 > 解决方案 > 弱到强引用仍然在查找时崩溃

问题描述

我在以下代码中的 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 异常的原因。

标签: iosobjective-c

解决方案


问题中发布的代码按预期工作。根据weakSelf的值检查异常中报告的内存地址后,地址不同。

在我们的讨论(https://chat.stackoverflow.com/rooms/218530/discussion-between-ol-sen-and-ekscrypto)中,很明显 KVO 实际上可能与崩溃有关。其中一名 KVO 观察者在被解除分配之前没有正确注销其观察者。


推荐阅读