我是一个出生的 Obj-C 程序员,并且只生活在后 ARC 世界。不过,为了我自己的效率,我最近决定阅读 Apple 的Transitioning to ARC Release Notes。在ARC Introduces New Lifetime Qualifiers部分中,有一个标题为Use Lifetime Qualifiers to Avoid Strong Reference Cycles的小节,描述了潜在地使用限定符以避免潜在的保留循环的各种方法。
我的问题与最后两个例子有关。最后两个示例中的第一个使用了我经常使用的模式,以避免过早地从非主线程中释放 UIKit 对象:
MyViewController *myController = [[MyViewController alloc] init…];
// ...
MyViewController * __weak weakMyViewController = myController;
myController.completionHandler = ^(NSInteger result) {
[weakMyViewController dismissViewControllerAnimated:YES completion:nil];
};
在上面的示例中,weakMyViewController
对象是使用弱引用创建的,myController
以便块引用weakMyViewController
可以使用它,并且在块返回时,weakMyViewController
可以安全地超出范围,而不会减少被引用的底层 UIKit 对象的引用计数。
不过,在下一个示例中,Apple 为“非平凡循环”显示了以下代码:
MyViewController *myController = [[MyViewController alloc] init…];
// ...
MyViewController * __weak weakMyController = myController;
myController.completionHandler = ^(NSInteger result) {
MyViewController *strongMyController = weakMyController;
if (strongMyController) {
// ...
[strongMyController dismissViewControllerAnimated:YES completion:nil];
// ...
}
else {
// Probably nothing...
}
};
在上面提供的“非平凡”示例中,相同的__weak
限定符用于从块内引用 UIKit 对象,但随后代码会创建__strong
对同一对象的本地隐式引用。然后对该本地__strong
参考进行非零条件测试,然后对其进行操作。
我的两个问题是:
Obj-C 程序员应该在什么考虑下实现第二种设计模式(而不是前者)?我不明白 Apple 关于“非平凡循环”的评论
不增加原始对象的保留计数的
__strong
引用如何?如果只是指向指向的基础对象的指针,那么强指针(即)不会增加基础对象(指向的对象)的保留计数吗?weakMyController
myController
weakMyController
myController
stringMyController
myController