2013-05-07 96 views
0

我在嵌套块中的__block变量有问题。我的问题是,应该像下面的代码工作?__block变量嵌套块的行为

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

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

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

+0

“如果我保留s时,我分配它(...),它工作正常。”是的,那就是你需要做的。另请注意,如果您在完成任务后未发布它,它将会泄漏。 – newacct 2013-05-07 21:46:18

回答

3

(我假设你不使用ARC)从Transitioning to ARC Release Notes

在手动引用计数模式,__block id x;还没有 保留x的效果。

所以你的假设是错误的,该块不保留s。如果 methodWithBlock异步工作,则必须保留它。

+0

哦,我不知道__block在ARC和手动参考计数中的工作方式不同。谢谢! – 2013-05-07 19:44:42

+0

@MarianoRuggiero:不客气。 - 是的,这是一个微妙的差异。幸运的是,我可以在所有项目中使用ARC :-) – 2013-05-07 19:49:45

+0

@MarianoRuggiero:是的,事实上,在MRC中,使用'__block'是使块不保留捕获变量的唯一方法。在ARC中,它们使用'__weak'或'__unsafe_unretained'来实现。 – newacct 2013-05-07 21:44:27