11

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

在以下主题中

在将对象传递给 -performSelector:withObject:afterDelay: 之前是否必须保留它?

performSelector:withObject:afterDelay:inModes 对保留计数的影响

调用 performSelector:withObject:afterDelay 的对象是否被 NSRunLoop 保留?

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

我正在使用以下代码

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

userData自动释放的对象在哪里。

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

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

先感谢您。

4

2 回答 2

11

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

保持

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

无保留

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

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

做同样的事情

[[self delegate] tryToSendStoreData:userData];
于 2012-06-27T17:56:16.683 回答
11

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

performSelector:withObject:afterDelay:的文档指出

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

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

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

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

于 2012-10-19T07:53:36.403 回答