2011-10-07 4 views
0

Итак, у меня есть UIPopover с NSTimer. У этого есть различные BOOLS и свойства, чтобы сделать другие методы, но это не важно прямо сейчас. Я хочу знать, есть ли способ освободить и аннулировать таймер, когда родительский вид popover исчез? Я попробовал методы класса, чтобы сделать недействительными и освободить таймер, но они дали мне предупреждения SIGABRT и EXC_BAD_ACCESS. Я думаю, что это как-то связано с тем, что таймер должен был сказать dealloc, когда он уже был нулевым.Остановить NSTimer в UIPopover

Пара дополнительных факторов: 1. Таймер должен оставаться в силе и выделяться при пополнении. 2. Таймер должен сделать недействительным и dealloc, когда родительский вид исчез.

Любые предложения?

КОД:

//@interface 
    NSTimer *clickTimer; 
@property (nonatomic, retain) NSTimer *clickTimer; 

//.m 
- (IBAction)clickerPressed:(id)sender 
{ 
if ([click isClicking] == YES) { 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 
    // enable the idle timer when the clicking is turned off 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 

} 
else { 
    // disable the idle timer while the metronome is clicking. 
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 
    [click setIsClicking:YES]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Stop" forState:UIControlStateNormal]; 
    [[NSThread currentThread] setThreadPriority:1.0]; 

    clickTimer = [[NSTimer scheduledTimerWithTimeInterval:[click clickRateInSeconds] target:self selector:@selector(click:) userInfo:nil repeats:YES]retain]; 
    } 

}

+1

Всегда, всегда, когда выпускаете переменную за пределами dealloc, установите ее на нуль. '[clickTimer release]; clickTimer = nil; ' – Joe

+0

Отредактировано, извините CodaFi

ответ

2

отпускании объект не назначается автоматически ноль указателя. Добавьте clickTimer = nil; после вашего заявления о выпуске. Это предотвратит доступ другого метода к недопустимому объекту, если он попытается освободить clickTimer.

Чтобы убедиться, что все ваши методы правильно установить clickTimer в ноль, вы могли бы рассмотреть вопрос о создании метода, который отменяет таймер для вас, а не того, чтобы каждый метод аннулирует таймер:

- (void) invalidateClickTimer 
{ 
    // invalidate timer 
    if (clickTimer == nil) 
     return; 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 

    // stop clicking 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 
    return; 
} 

Затем замените следующие строки в - (IBAction)clickerPressed:(id)sender

if ([click isClicking] == YES) { 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 
    // enable the idle timer when the clicking is turned off 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 
} 

с этой линией:

if ([click isClicking] == YES) { 
    [self invalidateClickTimer]; 
} 

Вызвать новый метод - (void) invalidateClickTimer из UIViewController родительского представления. Вероятно, в методе - (void)viewWillDisappear:(BOOL)animated

+0

Спасибо, я пробую его сейчас ... – CodaFi

+0

Нет, нет кубиков. Таймер недействителен и сделан ноль вашим методом, но он не перестанет нажимать – CodaFi

+0

Что не перестанет нажимать? –

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