不保留目标对象如何使用performSelector: afterDelay:?

5
我有一个类,使用NSURLConnection打开与服务器的长连接。当连接关闭时,无论是在connectionDidFinishLoading:还是connection:didFailWithError:中,我想等待15秒钟然后重试连接。
目前我正在使用[self performSelector:@selector(restartConection) withObject:nil afterDelay:15.0];,但这会导致不希望发生的情况,即当该对象由其创建者释放时,performSelector和NSURLConnections会永久保留“self”,并且它永远不会被解除分配。
如何在不永久保留对象的情况下实现这一点?非常感谢您的帮助。
谢谢,-Alec
2个回答

6
我认为你唯一的选择是发送。
[NSTimer cancelPreviousPerformRequestsWithTarget: object];

在释放对象之前,可能需要设置定时器。如果定时器尚未安排,则此操作不会执行,但从性能方面来看并不免费。


5
您无法避免保留对象。这是为了在下一个主循环周期中运行时调用您的选择器时,使您免受丑陋崩溃的影响而保留的。
如果您真的坚持要立即释放对象而不等待延迟的选择器,则建议您创建一个单独的代理类。假设您的类名为A,则创建一个代理类B,它将对您的类A进行弱引用(即__weak A* a),并具有restartConnection选择器,该选择器将检查弱引用是否有效。如果是,则会调用您的A对象上的restartConnection。然后,在B的restartConnection上进行延迟选择器。
但首先,我真的建议您重新评估一下是否真的无法接受保留。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接