performSelector:withObject:及其保留行为

Lor*_*o B 9 memory-management objective-c retain nsobject performselector

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

在以下主题中

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

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

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

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

我正在使用以下代码

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];
Run Code Online (Sandbox Code Playgroud)

哪里userData是自动释放的对象.

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

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

先感谢您.

new*_*cct 11

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

保留

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

没有保留

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

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];
Run Code Online (Sandbox Code Playgroud)

完全相同的事情

[[self delegate] tryToSendStoreData:userData];
Run Code Online (Sandbox Code Playgroud)


Man*_*nav 11

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

performSelector的文档:withObject:afterDelay:表明

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

所以接下来我们头以上的文件NSRunLoop,并在那里,我们发现,只有一个方法存在允许的能力来排队的运行循环的东西-
performSelector:目标:参数:命令:模式:,其文档指出

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

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


归档时间:

查看次数:

4859 次

最近记录:

9 年,9 月 前