【发布时间】:2016-09-04 02:04:08
【问题描述】:
在 Objective-C(从 Xcode 7 开始)中,用于基元的 __block 修饰符在 Stack Overflow(例如 here 和 Apple here in the Blocks Programming Guide)中有明确的解释。如果没有标签,则会捕获图元的副本,并且无法从块内修改原始图元。有了标签,就没有副本了,原来的可以在块内修改。
但是对于与指向对象的指针一起使用,情况并没有得到很好的解释。 Here Apple 说“对自身进行了强引用”或“对变量进行了强引用”。但是在页面的最后,Apple 说:
要覆盖特定对象变量的这种行为,您可以使用 __block 存储类型修饰符对其进行标记。
“覆盖此行为”是什么意思?
更复杂的事情是 Stack Overflow 上的一些帖子谈到在从块中调用对象时进行弱引用。
我不是试图建立一个对象。我只想从块中修改现有对象的状态。我相信该块是在同一个线程中同步调用的。
想象一下:
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修饰符修改该代码?应该如何修改带有弱引用的代码?
还有哪些其他问题适用于从块内修改的对象状态?
【问题讨论】:
-
关键问题是:区块由什么拥有?
标签: ios objective-c scope objective-c-blocks