我正在使用自动引用计数。
我希望对象一直存在,直到执行一些回调:
Foo *obj = [[Foo alloc] init];
[obj someMethod: @"AAA", ^(NSError * _Nullable error) {
//callback
});
我需要obj
一直活着直到“回调”被调用,但我实际上并没有在回调中使用它。
现在我“解决”它:
[obj someMethod: @"AAA", ^(NSError * _Nullable error) {
//callback
NSLog(@"To make sure that obj alive print it: %@", obj);
});
但这看起来很奇怪。对于这种情况,可能有一些语言结构,或者除了打印到日志之外,还有一些典型的解决方法吗?
最佳答案
如果使用外部变量 obj
在块内,然后它的值被捕获到块中。这会创建一个对对象的额外引用,以便自动引用计数使其保持事件状态,直到块执行为止。
要保留该引用,您无需将其传递给另一个函数,例如 NSLog()
.将它存储在局部变量中就足够了。
Foo *obj = [[Foo alloc] init];
[obj someMethod: @"AAA", ^(NSError * _Nullable error) {
Foo* keepObj = obj; // keeps obj alive
//callback
});
编辑:skaak 反馈后改进的解决方案:不需要未使用的局部变量名称,您可以通过强制转换为
void
来表示意图。 .Foo *obj = [[Foo alloc] init];
[obj someMethod: @"AAA", ^(NSError * _Nullable error) {
//callback
(void) obj; // release reference that kept obj alive
});
关于ios - 强制对象存活直到 block 被执行的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64129652/