目标C块作为asynchronouscallback和不良访问

我有一个严重的怀疑。 假设以下情况:

  1. 你有一个UIViewController在屏幕上。
  2. 应用程序启动,例如,使用块作为callback的后端调用
  3. 你使用“自我”代理来防止保留周期。
  4. 用户点击“后退”, UIViewController被取消分配。
  5. 迟早,callback块得到执行>> BAD ACCESS

在iOS 4之前,我们处理这种情况的方法是将…设置为nil我所知的delegate属性,无论您使用的是什么类。

但是现在…你怎么取消一个区块呢? 如果块被发送到一个静态方法,你没有办法消除这个callback引用?

在这种情况下,我们是否应该避免使用“自我”的代理?

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

 __block typeof(self) bself = self; 

谢谢!!

那么,首先: 如果 (并且只有)你的理由是避免使用self或直接访问Ivars在块内真的是保留周期,那么你应该处于

 client => objectA => blockWithWeakBackReference 

(其中=>意思是'有很强的参考')。

在这种情况下, blockWithWeakBackReference应该只能被objectA调用,所以不存在BAD ACCESS的危险。

如果我正确理解你的问题,你真正的意思是一个不同的情况:

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

其中一个例子可能是一个共享的networking队列,当请求完成加载时由于某种原因执行一个块。

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

然后,使用这个服务的所有对象都可以简单地拥有一个NSMutableSettypes的ivar来为每个入队的块存储token,并且在dealloc枚举剩余的令牌,并用服务取消它们。

“防止保留周期”。

但是,你真的有一个保留周期,以防止? 想想这个。 块保留self (您的视图控制器)。 后端调用保留该块。 但是self保留区块在哪里呢?