我有关于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。因此,一分钟后,保留计数为60。我知道不应该使用
retainCount
方法,但是这种方法真的是“不正确的”吗?怎么会?
最佳答案
NSInvocation
保留了它的目标,因为它需要目标在计时器启动时仍然存在。这个事实已经埋在 -[NSInvocation retainArguments]
的文档中:
如果接收者尚未这样做,请保留目标[...]
NSTimer
始终指示其NSInvocation
保留其参数,因为NSTimer
触发之前通常会有延迟。
这就是当有人说“框架类可能在您不知情的情况下保留东西”时的意思。关于Don't worry。
您可能要担心的是,*事实是,每次运行此代码(您似乎指示的情况经常发生)时,您正在创建一个新的NSInvocation
并重复使用与上次属性完全相同的NSTimer
实例,这似乎是浪费内存。
*除非这只是测试代码。
关于objective-c - NSTimer保留计数增加,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7309533/