ios - 当从 Objective-C 的 block 中访问时,对象是否需要 (a) `__block` 修饰符或 (b) 弱引用?

标签 ios objective-c scope objective-c-blocks

在 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 修改该代码修饰符?
  • 应该如何使用弱引用修改该代码?
  • 还有哪些其他问题适用于从 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/

    相关文章:

    ios - 将 WhatsApp 集成到 iOS 应用程序中

    objective-c - 使用哈希标签搜索打开 native Twitter 应用程序

    javascript - Window.onload 作用域

    javascript - 无法从 JS 函数访问组合日期

    ios - react-native-maps fitToSuppliedMarker/fitToCorodinates 不显示所有标记

    iphone - 无法解析以下 XML?

    ios - 应用程序发送旧推送和新推送

    ios - 遍历字典

    ios - SFSafariViewController 标题

    javascript - React-我应该使用 promise 来设置状态吗?