performSelector:withObject:及其保留行为

时间:2012-06-27 14:43:46

标签: objective-c memory-management retain nsobject performselector

这是SO中已经回答的问题,但我无法在Apple文档中找到它。你能指出我正确的方向吗?

在以下主题中

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?

默认行为似乎如下:它保留了接收者和参数

我正在使用以下代码

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

其中userData是自动释放的对象。

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

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

提前谢谢。

2 个答案:

答案 0 :(得分:11)

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

<强>保留

performSelector:withObject:afterDelay:和类似的函数( afterDelay)保留了接收者和参数,因为稍后执行

无保留

performSelector:withObject:和类似的功能(没有 afterDelay)不保留任何内容,因为它们只是直接调用该函数。

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

完全相同
[[self delegate] tryToSendStoreData:userData];

答案 1 :(得分:11)

虽然@newacct给出了正确的答案,但不是@Flex_Addicted提出的问题,即Apple的文档中引用的观察到的行为确实得到了保证。以下是(部分)引用,但我们必须通过几个环节才能到达那里 -

performSelector:withObject:afterDelay:的文档说明了

  

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

接下来我们转到NSRunLoop的文档,在那里我们发现只有一种方法允许在运行循环中排队的东西 -
performSelector:target:argument:order:modes:,其文档说明

  

此方法设置一个计时器,以在下一个运行循环迭代开始时在当前线程的运行循环上执行aSelector消息。计时器配置为以modes参数指定的模式运行... 接收器保留目标和anArgument对象,直到选择器的计时器触发,然后在清除时释放它们。

当然,没有什么可以保证[NSObject performSelector:withObject:afterDelay:]总是使用[NSRunLoop performSelector:target:argument:order:modes:](尽管如果有人可以提供相关的文档,这个答案就完整了),但至少这是迈向神秘的一步。回答神圣经文谜语的谜语。