iPhone - планирует ли TimeTimerWithTimeInterval сохранить параметр userInfo? - PullRequest
2 голосов
/ 31 июля 2011

В этом фрагменте кода у меня есть оба NSLog, который говорит, что dict имеет счет сохранения 1. Так как таймер может быть запущен в течение длительного времени, если в массиве много объектов, могу ли я сохранить данные в пользовательской информации? Потому что я предполагаю, что это авто-выпуск, а запланированный таймер времени с временным интервалом, похоже, не сохраняет его.

Теоретически? Практически?

- (void) doItWithDelay
{
    NSArray* jobToDo = /* get an autorelease array */

    NSTimeInterval nextLaunch = 0.1;
    int i=1;

    for (NSDictionary* dict in jobToDo) {
        NSLog(@"dict %d has %d retain count", i++, [dict retainCount]);

        // HERE [dict retain] ???
        [NSTimer scheduledTimerWithTimeInterval:nextLaunch target:self selector:@selector(doIt:) userInfo:dict repeats:NO];   
        nextLaunch += 1.0;
    }
}

- (void) doIt:(NSTimer*)theTimer 
{    
    NSDictionary* dict = [theTimer userInfo];

    NSLog(@"dict has now %d retain count", [dict retainCount]);

    // Do some stuff with dict
}

Ответы [ 3 ]

4 голосов
/ 31 июля 2011

В документе Apple NSTimer говорится, что он сохранит пользовательскую информацию. Ниже приводится цитата из документа ...

Указанный вами объект сохраняется таймером и освобождается, когда таймер становится недействительным.

Ваш второй NSLog говорит 1, так что я думаю, он уже был автоматически выпущен, но таймер все еще сохраняет его.

РЕДАКТИРОВАТЬ: Как предположил bbum, мы не должны полагаться на сохранение счета. Так что нам повезло, что в документе это четко указано.

3 голосов
/ 31 июля 2011

Как сказал Хомсан, в документах прямо говорится, что объект сохранен.

Конец истории.

retainCount бесполезен;не называй этоАбсолютное количество сохраняемых объектов - это деталь реализации.

0 голосов
/ 26 января 2014

не делает недействительным NSTimer перед попыткой его userInfo.

...