我对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
,但这种方法真的是“不正确”吗?
怎么回事?
答案 0 :(得分:3)
NSInvocation
保留其目标,因为当计时器触发时,它需要目标仍然存在。这个事实有点埋没在-[NSInvocation retainArguments]
的文档中:
如果接收方尚未这样做,则保留目标[...]
NSTimer
总是指示他们的NSInvocation
保留他们的论据,[...]因为在NSTimer
点火之前通常会有一段延迟。
当有人说“框架类可能会在不知情的情况下保留内容”时,这意味着什么。 Don't worry关于absolute retain counts。
您可能应该担心的是*每次运行此代码时(您似乎经常发生这种情况),您正在创建一个新的NSInvocation
并重复{{1}具有与上次完全相同的属性的实例,这似乎浪费了内存。
*除非这只是测试代码。