1

我有一个关于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不应该使用,但是这种方法真的是“不正确”吗?

怎么会?

4

1 回答 1

3

保留它的NSInvocation目标是因为它需要在计时器触发时目标仍然在附近。这个事实有点隐藏在以下文档中-[NSInvocation retainArguments]

如果接收者还没有这样做,则保留目标 [...]
NSTimer总是指示他们的 s 保留他们的论点,[...] 因为在触发NSInvocation之前通常会有延迟。NSTimer

这就是当有人说“框架类可能在你不知道的情况下保留东西”时的意思。不要担心绝对保留计数

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


*除非这只是测试代码。

于 2011-09-05T17:15:20.490 回答