ошибка malloc и сбой симулятора - PullRequest
0 голосов
/ 22 октября 2010

Я постоянно получаю ошибку malloc: дважды освобожден ....

Функция echoTime вызывается кнопкой.Когда я нажимаю кнопку еще раз до того, как таймер заканчивается, это выдает ошибку malloc.Когда я нажимаю кнопку после завершения таймера, чтобы запустить его снова, симулятор зависает.

Кто-нибудь знает, что не так со следующим фрагментом кода:

-(IBAction)echoTime: (id) sender {
    if (gameTimer != nil) {
        [gameTimer invalidate];
        [gameTimer release];
    }
    NSInteger secs = 1 * 60;
    if (secs != 0) {
        NSNumber *elapsedSeconds = [[NSNumber alloc] initWithInt:secs];
        NSDictionary *myDict = [NSDictionary dictionaryWithObject:elapsedSeconds forKey:@"TotalSeconds"];
        gameTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(echoIt:) userInfo:myDict repeats: YES];
    }
}

-(void)echoIt: (NSTimer *) timer {
    NSNumber *num = (NSNumber *) [[timer userInfo] valueForKey:@"TotalSeconds"];
    seconds++;
    NSInteger sec = [num integerValue] - seconds;
    NSInteger minutes = sec / 60;
    [gameTimeLabel setText:[NSString stringWithFormat:@"%02i:%02i", minutes, sec-(60*minutes)]];
    if (sec == 0) {
        [self playSound:@"Horn"];
        [gameTimer invalidate];
    }
}

1 Ответ

0 голосов
/ 23 октября 2010

NSNumber *elapsedSeconds = [[NSNumber alloc] initWithInt:secs];

Как правило, не выделяйте NSNumbers, а NSDictionary (и NSArray, NSSet) всегда сохраняет объекты, которые ему даны (и освобождает их, когда это необходимо).

try ...

NSNumber *elapsedSeconds = [NSNumber numberWithInt:secs];

Это остановит сохраненный цикл и может остановить аварийное завершение.

Также не имеет значенияно по стилю.

NSInteger secs = [[[timer userInfo] valueForKey:@"TotalSeconds"] intValue];

Немного эффективнее.

...