代码之家  ›  专栏  ›  技术社区  ›  lugte098

malloc错误和模拟器崩溃

  •  0
  • lugte098  · 技术社区  · 15 年前

    这个 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 回复  |  直到 14 年前
        1
  •  0
  •   Warren Burton    15 年前

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

    一般来说,不要分配NSNumbers和NSDictionary(和NSArray,NSSet)总是保留给定的对象(并在应该的时候释放它们)。

    尝试。。。

    NSNumber *elapsedSeconds = [NSNumber numberWithInt:secs];

    它将停止你的保留周期,并可能停止崩溃。

    也不相关,但风格上。

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