2011-01-26 2 views
1

Это, вероятно, то, что я должен знать, я создаю экземпляр NSTimer, используя метод класса NSTimer. Я уверен, что возвращенный объект будет автореализован, мой вопрос заключается в управлении памятью, если я должен сохранить и отпустить объект таймера (МЕТОД: 1) или просто просто назначить его прямо на @property (МЕТОД: 2) (или я должен делать что-то совершенно другое?)Сохраняемый объект, созданный методом класса?

// METHOD: 1 
@property (nonatomic, retain) NSTimer *myTimer; 

.

NSTimer *tempTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 
    [self setMyTimer:tempTimer]; 
    //[tempTimer release]; 

.

- (void)dealloc { 
    [pulseTimer release]; 
    [super dealloc]; 
} 

ИЛИ ПРОСТО:

// METHOD: 2 
myTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 

EDIT:

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

[NSTimer scheduledTimerWithTimeInterval:120.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 
+0

«NSTimer» имеет особое значение. Сообщение «scheduleTimerWithTimeInterval ...» не только инициирует таймер, но также добавляет его в runloop. Это предотвращает освобождение 'NSTimer', и вы должны вызывать метод' invalidate', чтобы вернуть права собственности из внутренних элементов цикла. Подробнее о [- (void) invalidate] (http://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/instm/ NSTimer/Invalidate). –

ответ

2

Для того чтобы принять владение над NSTimer вы можете сделать один из них с тем же эффектом:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval: ...]; // implicit setter 

или

[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:...]]; // explicit setter 

или

myTimer = [[NSTimer scheduledTimerWithTimeInterval: ...] retain]; 

или

self->myTimer = [[NSTimer scheduledTimerWithTimeInterval: ...] retain]; 
+0

Вы сохраняете myTimer дважды во втором примере, и поэтому вы должны его разблокировать. –

+0

@ Машина времени: в первом примере я написал то же, что [self setMyTimer: [NSTimer ...]]; Итак, только один раз.Нет 'release', если вам все еще нужна ссылка на NSTimer –

+0

. Я сказал второй пример. –

1

Это хороший способ:

self.myTimer = tempTimer; 
// don't call [tempTimer release] 

Это сохранит его automcailcally из-за имущества, которое удерживает его.

Просто звоните myTimer = … не использует установщик, а self.myTimer = … делает.

+0

Эпическое написание не работает. Глупая крошечная клавиатура iPod. –

+0

Обратите внимание, что это равно МЕТОДУ 1 без сообщения о выпуске. –

+0

Моя ошибка, мне не нужен релиз, поскольку у меня нет таймера (т. Е. Нет никакого выделения). Мое свойство сохраняет таймер при установке с помощью [self setMyTimer: tempTimer]; или self.myTimer = tempTimer; что сохранение сбалансировано с выпуском в dealloc. – fuzzygoat

Смежные вопросы