performSelector:withObject:和它的保留行为(performSelector

2019-06-25 20:09发布

这是一个已经回答中SO问题,但苹果的文档中我找不到它的任何地方 。 你可以点我在正确的方向?

在以下主题

我必须将它传递给-performSelector之前保留的对象:withObject:afterDelay :?

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

被对象调用performSelector:withObject:afterDelay由NSRunLoop得到保留?

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

我使用下面的代码

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

其中userData是一个autoreleased oject。

记录保留计数( 我知道这可能是无效的做 )的增量通过其保留计数的数据。 当该方法在委托调用时,保持计数不等于一。

所以,我的问题是:我是否需要进行一些内存管理,防止泄漏或我对苹果的东西放心? 在这里,我说作为一个不可知论者,因为我无法找到合适的文档。

先感谢您。

Answer 1:

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

保留

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

无保留

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

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

做同样的事情作为

[[self delegate] tryToSendStoreData:userData];


Answer 2:

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

对于文档withObject:afterDelay:performSelector指出,

此方法设置一个计时器上当前线程的run loop执行aSelector消息。

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

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

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



文章来源: performSelector:withObject: and its retain behavior