0

我已经测试了以下代码。

// Employee.h
@interface Employee : NSObject
@end

// Employee.m
@implement Employee
@end

// main.m
int main() {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    Employee* john = [[Employee alloc] init];

    void (^print)(void) = ^{
        NSLog(@"employee = %@", john);
    }

    [john release];
    [pool release];
    return 0;
}

我使用仪器跟踪了 john 的引用计数,但打印块中 john 的引用计数似乎没有增加。

我认为约翰应该被捕获并保留在打印块中。

我有什么误解?

4

1 回答 1

1

这里的块是基于堆栈的块。基于堆栈的块不保留本地上下文。

john当块被复制到堆中时将被保留(通过调用[print copy],不要忘记你需要或者releaseautorelease复制的块)。

ARC 知道何时必须复制和释放块,它会在必要时处理。你应该考虑使用它,它会让你的生活更容易处理块。


编辑

试试这个:

void (^print)(void) = [^{
        NSLog(@"employee = %@", john);
    } copy];

...

[print release];
于 2012-07-19T08:33:56.373 回答