在 Objective-C(从 Xcode 7 开始)中,__block
与原语一起使用的修饰符在 Stack Overflow 中有明确的解释,例如 here和苹果 here in the Blocks Programming Guide .如果没有标签,则会捕获图元的副本,并且无法从 block 内修改原始图元。使用标签,没有副本,并且可以从 block 内修改原始文件。
但是对于与指向对象的指针一起使用,情况并没有得到很好的解释。 Here苹果说要么“对自我进行了强引用”,要么“对变量进行了强引用”。但是在页面的最后,Apple 说:
To override this behavior for a particular object variable, you can mark it with the __block storage type modifier.
“覆盖此行为”是什么意思?
更复杂的事情是 Stack Overflow 上的一些帖子谈到在从 block 内调用对象时进行弱引用。
我不是要建立一个对象。我只想从 block 中修改现有对象的状态。我相信该 block 是在同一个线程中同步调用的。
想象:
Clicker* myClicker = [[Clicker alloc] init] ;
…
// Declare a block.
void (^myBlock)( );
// Populate the block.
myBlock = ^ void ( ) {
[myClicker click] ; // Updating some state in that object, such as incrementing a counter number or adding an element to a collection.
};
// Call `myBlock` synchronously (same thread) from some other code.
… // … invokes `myBlock` repeatedly …
我的问题:
__block
修改该代码修饰符? 最佳答案
你引用了有点过时的Blocks Programming Topics ,其中说:
To override this behavior for a particular object variable, you can mark it with the
__block
storage type modifier.
该文档可以追溯到手动引用计数时代,早于 ARC .在手动引用计数代码中,您可以使用
__block
避免建立 strong reference到 block 内引用的对象。但是,正如 Transitioning to ARC Release Notes 中所述,ARC 改变了这种行为。 .我们现在使用
weak
在那些我们不想建立对 block 中引用的对象的强引用的情况下。 (您可以使用 unsafe_unretained
在您知道生成的悬空指针不是问题的特殊情况下。)所以,继续使用
__block
在处理要在 block 内变异的基本类型时。但是在 ARC 下处理 block 中的对象时,__block
qualifier 一般不进入讨论。问题只是你想要一个强引用还是一个弱引用(或一个不安全、未保留的引用)。这在很大程度上取决于 object graph您的应用程序,即(a)您是否需要弱/未保留的引用来防止强引用循环;或 (b) 您不希望某个异步执行的 block 不必要地延长该 block 中引用的某些对象的生命周期。这些情况似乎都不是这里的情况。
关于ios - 当从 Objective-C 的 block 中访问时,对象是否需要 (a) `__block` 修饰符或 (b) 弱引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39312929/