NSTimer保留计数增加,为什么?

时间:2011-09-05 14:36:28

标签: objective-c ios memory-management retaincount

我对NSTimer有疑问。请参阅以下代码:

NSTimeInterval timeInterval = 1.0f;
SEL selector = @selector(executeDataRefresh);

NSMethodSignature *methodSignature = [[ExecuteDataRefesh class] instanceMethodSignatureForSelector:selector];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setTarget:executeDataRefresh];
[invocation setSelector:selector];

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:  timeInterval invocation:invocation repeats:YES];

对象executeDataRefresh的保留计数现在每次调用方法executeDataRefresh时都会增加1。因此,1分钟后保留计数为60。

我知道不应该使用方法retainCount,但这种方法真的是“不正确”吗?

怎么回事?

1 个答案:

答案 0 :(得分:3)

NSInvocation保留其目标,因为当计时器触发时,它需要目标仍然存在。这个事实有点埋没在-[NSInvocation retainArguments]的文档中:

  

如果接收方尚未这样做,则保留目标[...]   NSTimer总是指示他们的NSInvocation保留他们的论据,[...]因为在NSTimer点火之前通常会有一段延迟。

当有人说“框架类可能会在不知情的情况下保留内容”时,这意味着什么。 Don't worry关于absolute retain counts

您可能应该担心的是*每次运行此代码时(您似乎经常发生这种情况),您正在创建一个新的NSInvocation并重复{{1}具有与上次完全相同的属性的实例,这似乎浪费了内存。


*除非这只是测试代码。