9

这是SO中的一个已经回答的问题,但我无法在任何地方的Apple文档中找到它。你能指出我正确的方向吗?performSelector:withObject:及其保留行为

在以下主题

Do I have to retain an object before passing it to -performSelector:withObject:afterDelay:?

the effect on retain count of performSelector:withObject:afterDelay:inModes

Is object that calls performSelector:withObject:afterDelay get retained by the NSRunLoop?

默认的行为似乎是以下几点:它保留了接收器和参数(S)

我用下面的代码

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

其中userData是一个自动释放oject。

记录保留计数(我知道它可能无效)传入的数据会递增其保留计数。在代理上调用该方法时,保留计数不等于1。

所以,我的问题是:我是否需要执行一些内存管理以避免泄漏或者我必须信任Apple的东西?因为我找不到合适的文档,所以在这里我讲的是不可知论者。

预先感谢您。

+0

我相信数是根据ARC – Dustin

+0

@Cake不再准确,我没有在这个项目中使用ARC保留。谢谢。 –

+0

对于启用ARC项目,你可以看看 - http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown – rishi

回答

11

您正在查看文档中的错误功能。

保留

performSelector:withObject:afterDelay:和类似的功能(afterDelay)保留在接收器和参数,这是因为执行以后

未有保留

performSelector:withObject:和类似的功能(afterDelay)do不保留任何东西,因为他们只是直接调用函数。

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

做同样的事情作为

[[self delegate] tryToSendStoreData:userData]; 
+0

+1获得支持。但我找不到任何文件。另外,为什么在执行该呼叫之后,保留计数会增加其值?谢谢。 –

+0

@Flex_Addicted:功能通常保留并自动释放它们的参数,以增加安全性。这就是为什么看保留计数是无用的 – newacct

+0

谢谢。那么,如果你有任何文档,请链接它。干杯。 –

10

虽然@newacct给出了正确的答案,但它不是为质疑,认为@Flex_Addicted曾要求,即从苹果公司的文件所观察到的行为引文确实是保证。下面是一个(部分)引用,但我们必须要经过几个铁圈到那里的 -

performSelector:withObject:afterDelay:的文档指出

此方法设置一个计时器来执行aSelector消息在当前线程的运行循环中。

所以接下来我们头以上的文档NSRunLoop还有我们发现,只有一个方法存在允许的能力来排队的运行循环的东西 -
performSelector:target:argument:order:modes:,其文档指出

此方法设置一个计时器在下次运行循环迭代开始执行对当前线程的运行循环的aSelector消息。该定时器被配置为在由所述模式参数指定的模式下运行... 接收机保留了靶和anArgument对象,直到定时器用于选择器火灾,然后释放它们作为其清理的一部分。

当然,没有什么可以保证[NSObject performSelector:withObject:afterDelay:]总是使用[NSRunLoop performSelector:target:argument:order:modes:](虽然这个答案会是完整的,如果有人能想出文档是),但至少这是对回答谜语的神秘一步圣经与我们谜语。