此外,间接引用自还创建了一个保留自我。例如,如果_ivar
是一个实例变量,则访问它是对自我的隐式引用,因此以下内容也将保留自己。
^(id sender) {
[_ivar popViewControllerAnimated:YES];
}
此外,在您的weak
例如扩大,它是确定将消息发送到弱引用。如果它是零,什么都不会发生。如果不是,那么编译器将生成代码,通过调用方法确保引用保持有效。
所以,这是罚款:
__weak Foo *weakSelf = self;
^(id sender) {
[weakSelf.foo doSomething];
}
因为富要么是nil
如果还是不行,可以保证它始终保持的doSomething
执行非空。
然而,以下是不明智的,因为self
可以去nil
在两者之间通话,这可能不是你想要什么:
__weak Foo *weakSelf = self;
^(id sender) {
[weakSelf.foo doSomething];
[weakSelf.foo doSomethingElse];
}
在这种情况下,你可能想创建自己的很强的借鉴意义在块内部,所以在块的执行过程中你有一个一致的值。
在另一方面,如果直接通过弱引用访问实例变量,你必须做弱强的舞蹈,因为这样的代码:
__weak Foo *weakSelf = self;
^(id sender) {
weakSelf->_foo = bar;
}
将炸毁如果weakSelf
是nil
。
因此,在上述最后两种情况,你想要做的事,如:
__weak Foo *weakSelf = self;
^(id sender) {
Foo *strongSelf = weakSelf;
if (!strongSelf) return;
// Now, do anything with strongSelf, as it is guaranteed to be around
}
当然,伊娃的情况是只有一个问题,如果你真正直接访问高德...
在你的第二个例子,我认为你的意思是'[weakSelf.foo doSomething]; [weakSelf.foo doSomethingElse];' –
@ChristopherPickslay - 的确如此。谢谢! –