目标C块作为asynchronouscallback和不良访问
我有一个严重的怀疑。 假设以下情况:
- 你有一个
UIViewController
在屏幕上。 - 应用程序启动,例如,使用块作为callback的后端调用
- 你使用“自我”代理来防止保留周期。
- 用户点击“后退”,
UIViewController
被取消分配。 - 迟早,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议简单地复制NSNotificationCenter
的addObserverForName:object:queue:usingBlock:
,并使您的服务实现一对方法,如-(SomeTokenObjectType)addWorkerBlock:(void(^)(whatever-signature-makes-sense-for-you))
-(void)cancelWorkerBlockWithToken:(SomeTokenObjectType)
和-(void)cancelWorkerBlockWithToken:(SomeTokenObjectType)
为了排队和取消你的callback块。
然后,使用这个服务的所有对象都可以简单地拥有一个NSMutableSet
types的ivar来为每个入队的块存储token,并且在dealloc
枚举剩余的令牌,并用服务取消它们。
“防止保留周期”。
但是,你真的有一个保留周期,以防止? 想想这个。 块保留self
(您的视图控制器)。 后端调用保留该块。 但是self
保留区块在哪里呢?