objective-c - block 和异步回调,dealloc 对象 - 需要 nil block

标签 objective-c asynchronous dealloc block nszombie

这里有一个类似的问题,它并没有准确解释我想要什么:Objective C Blocks as Async-callbacks & BAD ACCESS

我有一个 View Controller ,它调用一个带有异步回调的服务。回调是使用一个 block 完成的,该 block 引用 View Controller 上的变量来填充它们。

看起来是这样的:

- (void) loadData {
    __block MyViewController *me = self;
    [self.service executeWithCompletion:^(NSArray *result, NSError *error) {
        if (!error) {
            me.data = result;  
        }
    }];
}

但是,如果我取消分配 View Controller ,回调将无法访问“我”。

使“我”为 NULL 的最简单方法是什么?如果我把它作为一个 iVar,它就会带回循环引用……我想?

我想我遗漏了一些明显的东西......

谢谢

最佳答案

您的目标是 iOS 5.0 或更高版本(或 Mac OS X 10.7 或更高版本)吗?如果是这样,您可以使用 ARC 和 __weak 变量(而不是 __block 变量)。当引用的对象被释放时,这将自动归零。你的代码看起来像

- (void)loadData {
    __weak MyViewController *me = self;
    [self.service executeWithCompletion:^(NSArray *result, NSError *error) {
        if (!error) {
            MyViewController *strongMe = me; // load __weak var into strong
            if (strongMe) {
                strongMe.data = result;
            }
        }
    }];
}

如果您需要对旧操作系统的支持,那么您需要寻找不同的解决方案。一种解决方案是直接让 block 保留 self。如果服务保证执行完成 block (然后释放它),这只会产生一个临时循环,当完成 block 运行时会自动中断。或者,如果您有某种方式可以取消服务(以保证取消后无法调用该 block 的方式),您可以坚持使用 __block 并确保在您的 -dealloc。还有其他选择,但它们更复杂。

关于objective-c - block 和异步回调,dealloc 对象 - 需要 nil block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905060/

相关文章:

objective-c - 什么是标准的 Objective-C BOOL getter 约定?

objective-c - 以 NSException 类型的未捕获异常终止?

iphone - 调用 MD5 函数时遇到问题(Objective-C、iPhone)

android - 有人可以解释如何在 Android 中使用 ASyncTask 吗?

c# - 进行长时间运行的异步调用就这么简单吗?

ios - 应用程序仍在运行时调用 UITableViewDelegate dealloc 方法

objective-c - 动画 UIVisualEffectView 模糊半径?

python - 尽管等待 API 响应,但使用 asyncio 没有加速

objective-c - 发送到解除分配实例的消息...在@synthesize 期间发送?

objective-c - 在 init 和 dealloc 方法中有效使用访问器?