gpt4 book ai didi

ios - 强制对象存活直到 block 被执行的正确方法

转载 作者:行者123 更新时间:2023-12-03 23:43:48 27 4
gpt4 key购买 nike

我正在使用自动引用计数。
我希望对象一直存在,直到执行一些回调:

 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com