ARC:在变量声明中正确使用__unsafe_unretained__block



下面的设计模式在我的应用程序中出现过几次。我正在转换为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
  • 使用CCD_ 3,因为否则CCD_
  • Xcode的ARC迁移工具为我添加了__unsafe_unretained。有必要吗?我意识到,如果没有它,区块将保留observer,但这太糟糕了吗?这会导致一个保留周期吗
  • 是否需要__unsafe_unretained的问题归结为是否会有一个保留周期。我们知道,如果它是一个强引用,那么块将保留observer。那么问题是,observer是否保留了块(甚至可能是块本身)?

    这是一个无法从第一原则中回答的问题。它需要知道observer对象是什么以及它在内部做什么。不幸的是,这是一个不透明的物体,苹果没有告诉我们太多,除了我们必须用它来移除观察者。文档中没有说明该对象是什么或可能在内部保留什么。我认为这是文件中的一个严重遗漏。

    根据其他StackOverflow的回答,例如this和this,根据经验,如果不使用从块到观察者的弱参考(__weak__unsafe_unretained),则会产生保留循环。因此,我们可以得出结论,observer对象保留(或,是)块。

    相关内容

    • 没有找到相关文章

    最新更新