考虑一下:
id observer = [[NSNotificationCenter defaultCenter]
addObserverForName:MyNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[[NSNotificationCenter defaultCenter]
removeObserver:observer
name:MyNotification
object:nil
];
// do other stuff here...
}
];
我使用这种模式来观察一次通知,然后停止观察它。但 LLVM 告诉我(在 ARC 下)变量“观察者”在被块捕获时未初始化。
我该如何解决这个问题,因为该块必须在初始化之前捕获变量,它是初始化程序的一部分?将使用__block
预选赛observer
做这件事吗?
正如答案中所解释的
为什么不调用从 NSNotificationCenter:addObserverForName:usingBlock 中删除观察者,
你必须
- add
__block
,以便该块将引用已初始化的变量,并且
- add
__weak
,以避免保留周期。 (后者仅适用于 ARC。如果没有 ARC,
该块不会创建strong参考一个__block
多变的。)
所以:
__block __weak id observer = [[NSNotificationCenter defaultCenter] ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)