gpt4 book ai didi

ios - 在后台线程中调用完成 block 时的僵尸

转载 作者:行者123 更新时间:2023-12-01 18:16:56 24 4
gpt4 key购买 nike

我将完成 block 传递给我的方法,当网络请求完成时,将在后台调用此完成 block 。不幸的是,如果调用对象同时被释放,应用程序崩溃:

ViewController(它可能被释放,因为它是从导航堆栈中弹出的)代码:

__unsafe_unretained ViewController *weakSelf = self;

[[URLRequester instance] sendUrl:url successBlock:^(id JSON) {
[weakSelf webserviceCallReturned:JSON];
}];

URLRequester-Code(当然更简单):
- (void)sendUrl:(NSString *)urlAfterHost successBlock:(void (^)(id))successBlock {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(2);
successBlock(nil);
return;
});
}

如果在这 2 秒内,ViewController 从导航堆栈中弹出,则应用程序崩溃。我错过了什么?

最佳答案

当您使用 __unsafe_unretained ,那么即使在对象被释放后引用仍然存在。所以如果 View Controller 被弹出,那么 weakSelf现在指向一个已释放的对象。

如果您将其更改为 __weak相反,当 View Controller 被释放时,它将设置 weakSelfnil ,你会没事的。你甚至不需要检查 if weakSelf设置为任何值,因为调用 nil 上的方法没有效果。

关于ios - 在后台线程中调用完成 block 时的僵尸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21003341/

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