阻止自动保留,甚至对自身的伊娃影响吗?

时间:2011-04-27 15:57:56

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

如果我上课:

@interface A : NSObject
{
    BOOL b;
    id   c;
}
@end

并在块中引用bc,块是自动保留self吗?或者只是bc?关于c,它可能会自行保留,但b怎么样?

2 个答案:

答案 0 :(得分:9)

比尔的答案不太正确:

如果您有一个A的实例,并在该实例中创建一个块,如下所示:

^{
  b = YES;
}

然后保留self(复制块时)。 b const - 已复制,因为bself强烈引用,且只有selfconst在块的范围内。

另一方面,如果你这样做:

BOOL aBool = YES;
^{
  aBool = NO;
  c = [[NSObject alloc] init];
}

然后,self再次const - 复制(并在复制块本身时保留),并允许分配给c。但是,aBOOL的分配不允许 ,因为aBool的值为const - 已复制。

换句话说,编译器识别出bc是ivars,并将直接保留self而不是ivars。


考虑到这一点的一种方法可以帮助我了解正在发生的事情是要记住一个对象实际上只是一个奇特的结构,这意味着您可以通过箭头操作符技术访问ivars:->

所以当你访问ivars时:

b = YES;

等同于

self->b = YES;

有鉴于此,为什么你必须保留self,但b不是const。这是因为b只是“大局”的一小部分,为了获得b,你必须同时包含所有self(因为复制结构的一部分)在这种情况下没有意义。)

答案 1 :(得分:1)

来自街区的代码将有助于回答,但假设你有类似的东西;

^(A *a) {
    [a doSomething];
}
块将保留

a并在块释放时释放。 bc不会发生任何异常情况。

如果你有类似的东西;

^(id c, BOOL b) {
    [c doSomethingElse];
}

然后c将被块保留,b将被块捕获为const值(即,b = NO会出现编译错误)

有关详细信息,请参阅文档;

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html%23//apple_ref/doc/uid/TP40007502-CH6-SW1