2011-09-05 44 views
1

我有关于NSTimer的问题。见下面的代码: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的保留计数现在将通过1方法executeDataRefresh的每次调用增加。所以1分钟后保留计数是60.

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

怎么回事?

+0

你可以添加executeDataRefresh方法的代码吗?我怀疑它与你的问题有关。 – ChristophK

+4

如果你知道它不应该被使用,你为什么要使用它? – edo42

+0

edo42:我有内存管理的问题,所以在绝望的尝试修复它,我开始记录retainCount ..但是,是的,你是对的,它产生了更多的问题,而不是答案。 – user521048

回答

3

NSInvocation保留其目标,因为它需要目标仍然在计时器启动时。这一事实是那种埋在文档中的-[NSInvocation retainArguments]

如果接收方已经没有这样做,保留目标[...]
NSTimer总是指示其NSInvocation s到保留他们的论点, [...]因为在NSTimer火灾之前通常会有延迟。

这是什么意思,当有人说“框架类可能会保留你不知道的东西”。 Don't worryabsolute retain counts

您可能应该担心的是*每次运行此代码(您似乎都会经常发生这种情况),您将创建一个新的NSInvocation并重复使用具有完全相同属性的NSTimer实例作为最后一次,这似乎是在浪费记忆。


*除非这只是测试代码。

+0

我已阅读关于setTarget:在http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/Reference/Reference.html 它说:“分配给对象接收器作为目标“。关于设置为目标的对象。单词“assign”的用法很有意思:) – user521048

+0

这里使用“assign”这个词不太可能与声明属性的'assign'关键字有关,这意味着内存管理。但是,我错误地认为'NSInvocation'自动地保留了它的目标。它不会,但是'NSTimer'会导致它这样做,并且我已经添加了一个指向这个文档的引用。 –