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

标签 ios objective-c objective-c-blocks

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

 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/

相关文章:

ios - 谁保留 block ?

ios - 无法在 swift 中使用 Objective-c block

ios - iOS在不同的父项下解析具有相同名称的多个标签的XML

ios - Swift - 当设备处于静音状态时,AVAudioPlayer 仍在播放声音吗?

objective-c - 自学XCode/Objective-C : 'static' doesn't seem to mean what I *think* it means

ios - objective-c: ScrollView 滚动到左右方向

ios - AVPlayer 音频在比特率峰值后停止

ios - Xcode 7 + Dropbox 核心 API : Simply disable Bitcode?

ios - 如何为此 View 设置约束?

iphone - 将完成与 animateWithDuration 一起使用会导致 exc_bad_access