这是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的东西?在这里,我作为一个不可知论者说话,因为我找不到合适的文档。
提前谢谢。
答案 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:]
(尽管如果有人可以提供相关的文档,这个答案就完整了),但至少这是迈向神秘的一步。回答神圣经文谜语的谜语。