【问题标题】:Weak to Strong reference still crashes on lookup弱到强引用仍然在查找时崩溃
【发布时间】: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 类的一部分,您实际上是在调用一个异步访问只读属性的方法。

标签: ios objective-c


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多