performSelector:afterDelay:没有保留目标?

时间:2012-01-15 21:06:13

标签: objective-c ios nsurlconnection automatic-ref-counting

我有一个使用NSURLConnection打开与服务器的长连接的类。当连接关闭时,无论是在connectionDidFinishLoading:还是connection:didFailWithError:中,我想等待15秒然后重试连接。

目前我正在使用[self performSelector:@selector(restartConection) withObject:nil afterDelay:15.0];,但这会导致一种不受欢迎的情况,即当对象被其创建者释放时,performSelector和NSURLConnections将永久保留“self”,并且永远不会被释放。< / p>

如何在不永久保留对象的情况下执行此操作?任何帮助都会非常感激。

谢谢,-Alec

2 个答案:

答案 0 :(得分:5)

我认为你唯一的选择是发送

[NSTimer cancelPreviousPerformRequestsWithTarget: object];
在某些时候,可能是在释放对象之前。如果没有安排计时器,这是一个无操作,但在性能方面不是免费的。

答案 1 :(得分:5)

你无法避免保留对象。保留它是为了在下一个主循环周期中保存您免于丑陋的崩溃,运行时将在已发布的对象上调用您的选择器。

如果您真的坚持在不等待延迟选择器的情况下立即释放对象,我建议您创建一个单独的代理类。假设您的班级名为A,创建代理班级B,其中包含弱参考到您的班级A(即__weak A* a)和{ {1}}选择器将检查弱引用是否有效。如果是这样,它将在restartConnection对象上调用restartConnection。然后,当然,A的{​​{1}}

上的延迟选择器

但首先,我真的建议你重新评估一下你是否真的不能接受保留。