【问题标题】:Does calling of a block with a variable guarantee that its lifecycle will be retained?调用带有变量的块是否保证其生命周期将被保留?
【发布时间】:2012-12-16 16:24:33
【问题描述】:

我有一些 typedef:

typedef void (^myBlock)(SomeObject);

我有一些对象

@interface SomeObject : NSObject
@end

// Method of some arbitrary class
- (void) someMethod1 {
    SomeObject *someObject = [[SomeObject alloc] init];

    myBlock block = ^(SomeObject obj){
        // When _block(someObject)_ will be called inside someQueue - 
        // Is it guaranteed that someObject will be alive, retained inside me?       

        // Do something complex and involving (or not) obj ...    
    }

    dispatch_async(someQueue, ^{
        // Some bunch of code - after which we are sure that 
        // by the next line someMethod1 will run out, so its scope is lost

        block(someObject);
    });
}

问题放在 block 变量的块中:是否保证我们传递给 someQueue 队列中的块 block 的 someObject 对象会在 block 块内活着并保留

这个问题是我刚刚提出的问题的一个更复杂的变体:Does a passing of an object to a block guarantee that its lifecycle will be retained?

【问题讨论】:

  • 我想你可以在我的回答中问。
  • 谢谢@RamyAlZuhouri!没有更多类似的问题。

标签: objective-c automatic-ref-counting objective-c-blocks


【解决方案1】:

该块及其将使用的所有内容都将保留到该块执行之后..它被捕获

【讨论】:

    【解决方案2】:

    我相信您的问题与上一个问题相同。这里唯一的区别是您不是在块内调用方法,而是在调用块。
    可能我的回答不够清楚:一切都保留在一个块中,甚至保留一个块。

    dispatch_async(someQueue, ^{
        // Some bunch of code - after which we are sure that 
        // by the next line someMethod1 will run out, so its scope is lost
    
        block(someObject);
    });
    

    在你调用someObject的block里面,所以someObject被捕获了。block也被捕获了。

    【讨论】:

    • "如果你不使用 ARC,你可以调用 [myBlock retain] 来保留块。"什么?不。“没有 ARC,这样做的方法是使用 __block 变量。”这是什么”?我认为你搞反了。
    • 你说的是“块”吗?
    • 不,我是说“如果你不使用 ARC,你可以调用 [myBlock retain]”是错误的。如果您不使用 ARC,则不会调用 [myBlock retain]
    • 所以我删除了所有关于非ARC的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2011-12-07
    相关资源
    最近更新 更多