可能在非主队列上释放 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
不会在块 运行 时被释放,因为它拥有强引用。
它将在块执行完成后被释放,因为在你的情况下它是最后一个强引用。谁应该关心这个,因为没有其他人对此有很强的参考?
我在 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
不会在块 运行 时被释放,因为它拥有强引用。
它将在块执行完成后被释放,因为在你的情况下它是最后一个强引用。谁应该关心这个,因为没有其他人对此有很强的参考?