下面的设计模式在我的应用程序中出现过几次。我正在转换为ARC。有人能证实__unsafe_retained __block
的用法是否正确吗?
__unsafe_unretained __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:MyNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[[NSNotificationCenter defaultCenter] removeObserver:observer];
// ...
}];
一些注意事项:
使用__unsafe_unretained
是因为部署目标是10.6
__unsafe_unretained
。有必要吗?我意识到,如果没有它,区块将保留observer
,但这太糟糕了吗?这会导致一个保留周期吗是否需要__unsafe_unretained
的问题归结为是否会有一个保留周期。我们知道,如果它是一个强引用,那么块将保留observer
。那么问题是,observer
是否保留了块(甚至可能是块本身)?
这是一个无法从第一原则中回答的问题。它需要知道observer
对象是什么以及它在内部做什么。不幸的是,这是一个不透明的物体,苹果没有告诉我们太多,除了我们必须用它来移除观察者。文档中没有说明该对象是什么或可能在内部保留什么。我认为这是文件中的一个严重遗漏。
根据其他StackOverflow的回答,例如this和this,根据经验,如果不使用从块到观察者的弱参考(__weak
或__unsafe_unretained
),则会产生保留循环。因此,我们可以得出结论,observer
对象保留(或,是)块。