9

考虑一下:

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成功吗?

4

3 回答 3

17

如答案中所述

为什么不从 NSNotificationCenter 删除观察者:addObserverForName:usingBlock 被调用

你必须

  • add __block,以便块将引用初始化的变量,并且
  • 添加__weak, 以避免保留循环。(后者仅适用于 ARC。没有 ARC,块不会创建对变量的引用。)__block

所以:

__block __weak id observer = [[NSNotificationCenter defaultCenter] ...
于 2013-10-22T20:59:47.083 回答
0

是的,我认为事先声明观察者__block id observer;应该有效。

于 2013-10-22T20:52:29.650 回答
0

是的,使用__block将解决问题。

没有它,Block 会在创建 Block 时获取变量值的副本。(在这种情况下是“未初始化的”。)有了它,块(本质上)获取变量本身,以便可以从块内更改值。因此,它还将“跟踪”外部所做的更改。

于 2013-10-22T20:54:53.393 回答