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自动?或者只是b和c?关于c,可能会保留自己,但是怎么样b?
比尔的答案不太正确:
如果您有一个实例A并在该实例内创建一个块,如下所示:
^{
b = YES;
}
Run Code Online (Sandbox Code Playgroud)
然后self保留(复制块时). b是不 const -copied,因为b强烈地受到参考self,而仅self是const该块的范围内.
另一方面,如果你这样做:
BOOL aBool = YES;
^{
aBool = NO;
c = [[NSObject alloc] init];
}
Run Code Online (Sandbox Code Playgroud)
然后再次self进行const复制(并在复制块本身时保留)并c允许赋值.然而,分配aBOOL是不容许的,因为价值aBool是const-copied.
换句话说,编译器识别b和c是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(因为复制结构的一部分在这种情况下并不真正有意义).