给App新加了个功能,测试新安装正常,测试版本升级的时候崩了。虽然知道是因为死循环,但是为什么新安装没崩,有点莫名其妙,记录一下。

顺带说一嘴:真机测试的时候,删除老版本从Xcode安装属于新安装测试;从Appstore安装老版本后再从Xcode安装属于版本升级测试。这两个测试都要做一下,不然可能会出现我这个问题,新安装没事,版本升级闪退。

新版本在AppDelegate加了个定时器做循环定时任务,一运行就崩,提示

warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.

定时器的代码如下

- (void)startFireDateTimer {
    if (TARGET_IPHONE_SIMULATOR) {
        return;
    }
    NSUserDefaults *segmentedMark=[NSUserDefaults standardUserDefaults];
    NSInteger inTime = [segmentedMark integerForKey:@"tag1"]*60;
    self.oldTime = inTime;
    NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:self.oldTime];
    
    // 创建定时器
    _timer = [[NSTimer alloc] initWithFireDate:fireDate
                                              interval:self.oldTime
                                                target:self
                                              selector:@selector(targetMethod:)
                                              userInfo:nil
                                               repeats:YES];
    
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:_timer forMode:NSDefaultRunLoopMode];
    [_timer fire];
}
- (void)targetMethod:(NSTimer *)theTimer{
    
    NSUserDefaults *sg=[NSUserDefaults standardUserDefaults];
    [sg setBool:YES forKey:@"tag2"];
    [sg synchronize];
    //改变循环时间后重新调用计时器
    if (self.oldTime!=[sg integerForKey:@"tag1"]*60) {
        [theTimer invalidate];
        theTimer = nil;
        
        [self startFireDateTimer];
    }
}

因为需要一直循环执行,逻辑是循环时间改变后释放当前定时器重新创建一个新的。真机调试Xcode新安装测试正常,但是版本升级测试就给我当死循环干掉了。好奇怪。

问题出在最后一个if语句里的self调用,方法一调方法二,方法二再用自己调方法一…死循环就是这么来的。

[self startFireDateTimer];

把方法startFireDateTimer改成类方法应该能解决吧,没试。

把if删了,把这个判断逻辑放到传值接收方法里,搞定。