块:在完成处理程序中释放对象?

taj*_*hal 7 macos block objective-c

在我的applicationDidFinishLaunching:方法中,我创建了一个对象并在其上调用异步方法,如下所示:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    Foo *foo = [[Foo alloc] init];

    [foo asynchronousMethodWithCompletion:^{
        // Location A
    }];

    // Location B
}
Run Code Online (Sandbox Code Playgroud)

如果我不使用ARC,我必须在哪里放[foo release]?在完成块(位置A)内或异步方法调用之后(位置B)?或者根本不重要?

Dav*_*eyl 6

你放在[foo release]位置B,就像你通常会做的那样,如果有一个常规的方法调用而不是块.该块将保留该对象并在完成后释放它.

  • @tajmahal:如果被复制,该块只会保留`foo`.但是如果该块超过了呼叫,则可以保证该块被复制.是否必须在`asynchonousMethodWithCompletion:`中写`copy`取决于它的编写方式(你没有向我们展示代码).您需要在存储之前将其复制,以便以后存储,例如在实例变量或一般容器中; 如果它只是简单地传递给另一个接受块参数的函数,那么不需要复制,因为***函数负责复制它,如果它需要存储它以供以后使用. (2认同)
  • @tajmahal:就像我说的,如果`asynchronousMethodWithCompletion:`存储块(正如你所做的那样,在一个实例变量中),那么它需要存储块的副本(正如你所做的那样,`x = [block copy] ;`,你需要在释放`Foo`或重新分配`x`时释放它,就像所有对象实例变量一样)如果你的`asynchronousMethodWithCompletion:`只是调用`dispatch_async()`之类的东西块并且不存储它本身,然后它不需要复制它."对象会自动保留,直到我再次释放该块?" 直到块被解除分配 (2认同)