如果我上课:
@interface A : NSObject
{
BOOL b;
id c;
}
@end
并在块中引用b
和c
,块是自动保留self
吗?或者只是b
和c
?关于c
,它可能会自行保留,但b
怎么样?
答案 0 :(得分:9)
比尔的答案不太正确:
如果您有一个A
的实例,并在该实例中创建一个块,如下所示:
^{
b = YES;
}
然后保留self
(复制块时)。 b
不 const
- 已复制,因为b
被self
强烈引用,且只有self
为const
在块的范围内。
另一方面,如果你这样做:
BOOL aBool = YES;
^{
aBool = NO;
c = [[NSObject alloc] init];
}
然后,self
再次const
- 复制(并在复制块本身时保留),并允许分配给c
。但是,aBOOL
的分配不允许 ,因为aBool
的值为const
- 已复制。
换句话说,编译器识别出b
和c
是ivars,并将直接保留self
而不是ivars。
考虑到这一点的一种方法可以帮助我了解正在发生的事情是要记住一个对象实际上只是一个奇特的结构,这意味着您可以通过箭头操作符技术访问ivars:->
所以当你访问ivars时:
b = YES;
等同于:
self->b = YES;
有鉴于此,为什么你必须保留self
,但b
不是const
。这是因为b
只是“大局”的一小部分,为了获得b
,你必须同时包含所有self
(因为复制结构的一部分)在这种情况下没有意义。)
答案 1 :(得分:1)
来自街区的代码将有助于回答,但假设你有类似的东西;
^(A *a) {
[a doSomething];
}
块将保留 a
并在块释放时释放。 b
和c
不会发生任何异常情况。
如果你有类似的东西;
^(id c, BOOL b) {
[c doSomethingElse];
}
然后c
将被块保留,b
将被块捕获为const
值(即,b = NO
会出现编译错误)
有关详细信息,请参阅文档;