可能在非主队列上释放 UIKit 对象

Possible deallocation of UIKit object on the non-main queue

我在 public API 中遇到过几次以下代码样式:

@interface UITextField (SomeFunctionalitySupport)

- (void) someMethod {
    @weakify(self)
    dispatch_async(someConcurrentQueue, ^{
        @strongify(self)
        self.text = @"Some text"
    })
}

@end

鉴于 UITextField 是 UIKit 对象,它应该在主队列上被释放。据我了解,weakify/strongify 宏只是一种不手动声明 __weak__strong 局部变量并对强变量执行条件检查的巧妙方法。

但是 __strong 增加了引用计数,对吧?因此,在块完成之前,我们将拥有一个更强大的参考。并且块在非主队列上运行。如果在块执行期间强引用成为最后一个怎么办?从逻辑上讲,self 会在块完成时被释放。但这不会发生在主队列上,这可能会导致严重的问题。

是 API 创作者错了还是我遗漏了什么?

self 不会在块 运行 时被释放,因为它拥有强引用。

它将在块执行完成后被释放,因为在你的情况下它是最后一个强引用。谁应该关心这个,因为没有其他人对此有很强的参考?