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

Eon*_*nil 4 memory-management objective-c objective-c-blocks

如果我上课:

@interface A : NSObject
{
    BOOL b;
    id   c;
}
@end
Run Code Online (Sandbox Code Playgroud)

和参考b以及c在一个块中,在块保留self自动?或者只是bc?关于c,可能会保留自己,但是怎么样b

Dav*_*ong 9

比尔的答案不太正确:

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

^{
  b = YES;
}
Run Code Online (Sandbox Code Playgroud)

然后self保留(复制块时). b const -copied,因为b强烈地受到参考self,而仅selfconst该块的范围内.

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

BOOL aBool = YES;
^{
  aBool = NO;
  c = [[NSObject alloc] init];
}
Run Code Online (Sandbox Code Playgroud)

然后再次self进行const复制(并在复制块本身时保留)并c允许赋值.然而,分配aBOOL容许的,因为价值aBoolconst-copied.

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


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

所以当你访问ivars时:

b = YES;
Run Code Online (Sandbox Code Playgroud)

等价于:

self->b = YES;
Run Code Online (Sandbox Code Playgroud)

有鉴于此,它非常有意义,为什么你要保留self,但b不是const.这是因为b它只是"更大图片"中的一小部分,为了获得b,你必须包含所有这些self(因为复制结构的一部分在这种情况下并不真正有意义).