具有嵌套块的__block变量行为

时间:2013-05-07 14:08:48

标签: objective-c memory-management objective-c-blocks retain

我在嵌套块中遇到__block变量问题。我的问题是,如果代码如下工作吗?

__block NSString* s = nil;
[self methodWithBlock:^
 {
    s = [self methodThatReturnsAnAutoreleasedString];
    [self methodWithBlock:^
     {
         [NSLog @"%d", s.length];
     }];
 }];

我假设内部块保留s,但在我的代码中似乎并非如此。当访问内部块中的s时,我收到一条“消息,发送到解除分配的实例”。如果我在分配它时保留s(s = [[self methodThatReturnsAnAutoreleasedString] retain];),它就可以正常工作。

当然,这不是我的实际代码,这更复杂,但我只是想知道这个最小的例子是否应该正常工作。如果是这样,我需要在其他地方寻找我的问题。

1 个答案:

答案 0 :(得分:3)

(我假设您不使用ARC。)来自Transitioning to ARC Release Notes

  

在手动引用计数模式下,__block id x;具有不起作用的效果   保留x

因此,您的假设是错误的,该块不会保留s。如果,你必须保留它 methodWithBlock异步工作。