NSTimer сохраняет счет увеличивается, почему? - PullRequest
1 голос
/ 05 сентября 2011

У меня проблема с 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 не следует использовать, но действительно ли этот метод "неправильный"?*

1 Ответ

3 голосов
/ 05 сентября 2011

NSInvocation сохраняет свою цель, потому что ей нужно, чтобы цель все еще была рядом, когда срабатывает таймер. Этот факт как бы скрыт в документации для -[NSInvocation retainArguments]:

Если получатель еще не сделал этого, сохраняет цель [...]
NSTimer всегда инструктируют своих NSInvocation сохранять свои аргументы, [...] потому что обычно срабатывает задержка до NSTimer.

Это то, что имеется в виду, когда кто-то говорит: «Классы фреймворка могут сохранять вещи без вашего ведома». Не волнуйтесь о абсолютных счетах удержания .

Вместо этого вам, возможно, следует беспокоиться * о том, что каждый раз, когда вы запускаете этот код (который, как вы, похоже, указываете, случается довольно часто), вы создаете новый NSInvocation и повторяющийся экземпляр NSTimer с точно те же атрибуты, что и в прошлый раз, что кажется пустой тратой памяти.


* Если только это не тестовый код.

...