gpt4 book ai didi

objective-c - iOS 和 ARC : How to retain self during asynchronous operations?

转载 作者:IT王子 更新时间:2023-10-29 08:16:15 24 4
gpt4 key购买 nike

这是我第一次摆弄 iOS5 和 ARC。到目前为止,一切顺利,但我遇到了一些问题。

我有一个自定义的 UIStoryboardSegue,我在其中使用 Facebook Connect(或其他服务)将用户登录到我的应用程序。简而言之,它应该执行以下操作:

  1. 用户点击按钮
  2. 按钮触发 Segue
  3. segue 启动异步登录但不会立即推送 View Controller
  4. 当且仅当登录成功时,segue 推送 View Controller

相反,登录开始了,但是在它有任何机会完成之前,ARC 立即释放了 segue。

我想到了一个快速的'n'dirty hack 来防止这种情况:

@interface BSLoginSegue() {
__strong BSLoginSegue *_retained_self;
}
@end

// Stuff...
// Other stuff...

- (void) perform {
login();
_retained_self = self;
}

- (void) loginServiceDidSucceed:(BSLoginService *)svc {
...
_retained_self = nil;
}

问题是,它真的一个hack,所以我想知道是否还有其他更优雅的方法可以做同样的事情?

最佳答案

如果您使用 Grand Central Dispatch (GCD) 用于并发(你应该这样做,太棒了!)然后通过将对你的对象的引用放在 Objective-C block 中并将其传递到 GCD 中,它将被 block 自动保留,直到 block 执行完毕并自身被释放。

如果不确切知道您是如何进行异步操作的,就很难给出明确的答案,但是通过使用 blocksGCD你根本不必担心这个。该 block 将负责保留它引用的对象,ARC 将完成其余的工作。

看起来您必须在某处存储对您的 UIStoryboardSegue 子类的引用,以便在其上调用 loginServiceDidSucceed:,因此也许只需将其设为强引用即可工作。再次从 block 引用它(例如登录成功时的完成 block )是理想的。我建议调整您的登录代码以使用 block 来进行成功/失败回调。

关于objective-c - iOS 和 ARC : How to retain self during asynchronous operations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518782/

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