如果我有课:
@interface A : NSObject
{
BOOL b;
id c;
}
@end
和参考b
and c
在一个块中,是块保留self
自动地?要不就b
and c
? About c
,它可能会被保留,但是怎么样b
?
比尔的回答不太正确:
如果你有一个实例A
并在该实例内创建一个块,如下所示:
^{
b = YES;
}
Then self
被保留(当块被复制时)。b
is not const
-复制,因为b
被强烈引用self
,并且仅self
is const
块范围内。
另一方面,如果你这样做:
BOOL aBool = YES;
^{
aBool = NO;
c = [[NSObject alloc] init];
}
话又说回来,self
is const
-copied(并在复制块本身时保留)并分配给c
被允许。然而,分配给aBOOL
is not允许,因为值aBool
is const
-copied.
换句话说,编译器识别b
and c
是 ivars,并将保留self
而不是直接使用ivars。
思考这个问题的一种方法可以帮助我理解正在发生的事情,那就是记住对象实际上只是一个奇特的结构,这意味着您可以在技术上通过箭头运算符访问 ivars:->
因此,当您访问 ivars 时:
b = YES;
is 相等的 to:
self->b = YES;
从这个角度来看,这是完全有道理的why你必须保留self
, but b
is not const
。这是因为b
只是“大局”的一小部分,并且为了获得b
,您必须包括所有self
同样(因为复制结构体的一部分在这种情况下并没有真正意义)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)