gpt4 book ai didi

objective-c - Objective C block 作为异步回调和 BAD ACCESS

转载 作者:技术小花猫 更新时间:2023-10-29 11:24:03 25 4
gpt4 key购买 nike

我有一个严重的怀疑。假设以下场景:

  1. 屏幕上有一个 UIViewController
  2. 例如,该应用使用 block 作为回调发起后端调用
  3. 您使用“ self ”代理来防止保留循环。
  4. 用户点击“返回”,UIViewController 被释放。
  5. 迟早会执行回调 block >> BAD ACCESS

在 iOS 4 之前,我们通过将 delegate 属性设置为 nil 来处理这种情况......我不知道,无论你使用什么类.

但是现在......你如何取消一个 block ??。如果 block 被发送到静态方法,并且您无法清除该回调引用怎么办??。

在那种情况下,我们应该避免使用“self”代理吗?

顺便说一句,通过“ self ”代理人,我的意思是:

__block typeof(self) bself = self;

谢谢!!

最佳答案

好吧,首先:如果(且仅当)您避免使用 self 或直接访问 block 内的 ivars 的原因确实是保留循环,那么您应该处于以下情况喜欢

client => objectA => blockWithWeakBackReference

(其中 => 表示“具有强引用”)。

在这种情况下,blockWithWeakBackReference 只应由 objectA 调用,因此不存在错误访问的危险。

如果我正确理解你的问题,你真正的意思是不同的场景:

  • objectA 希望某个应用程序范围内的服务代表它 执行一个 block ,前提是满足某些先决条件。
  • 您避免在 block 内使用 self,因为您希望能够在执行 block 之前处理 objectA

这方面的一个示例可能是一个共享网络队列,它在请求由于某种原因完成加载时执行一个 block 。

在这种情况下,我建议简单地复制 NSNotificationCenteraddObserverForName:object:queue:usingBlock: 的设计,并让您的服务实现一对方法像 -(SomeTokenObjectType)addWorkerBlock:(void(^)(whatever-signature-makes-sense-for-you))-(void)cancelWorkerBlockWithToken:(SomeTokenObjectType)为了排队和取消你的回调 block 。

然后,所有使用此服务的对象都可以简单地拥有一个 NSMutableSet 类型的 ivar 来存储每个排队 block 的 token ,并在它们的 dealloc 中枚举剩余的 token ,用服务取消它们。

关于objective-c - Objective C block 作为异步回调和 BAD ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6885514/

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