我有一个使用NSURLConnection打开与服务器的长连接的类。当连接关闭时,无论是在connectionDidFinishLoading:还是connection:didFailWithError:中,我想等待15秒然后重试连接。
目前我正在使用[self performSelector:@selector(restartConection) withObject:nil afterDelay:15.0];
,但这会导致一种不受欢迎的情况,即当对象被其创建者释放时,performSelector和NSURLConnections将永久保留“self”,并且永远不会被释放。< / p>
如何在不永久保留对象的情况下执行此操作?任何帮助都会非常感激。
谢谢,-Alec
答案 0 :(得分:5)
我认为你唯一的选择是发送
[NSTimer cancelPreviousPerformRequestsWithTarget: object];
在某些时候,可能是在释放对象之前。如果没有安排计时器,这是一个无操作,但在性能方面不是免费的。
答案 1 :(得分:5)
你无法避免保留对象。保留它是为了在下一个主循环周期中保存您免于丑陋的崩溃,运行时将在已发布的对象上调用您的选择器。
如果您真的坚持在不等待延迟选择器的情况下立即释放对象,我建议您创建一个单独的代理类。假设您的班级名为A
,创建代理班级B
,其中包含弱参考到您的班级A
(即__weak A* a
)和{ {1}}选择器将检查弱引用是否有效。如果是这样,它将在restartConnection
对象上调用restartConnection
。然后,当然,A
的{{1}}
但首先,我真的建议你重新评估一下你是否真的不能接受保留。