在scheduledTimerWithTimeInterval方法中缺少NSDate?

时间:2011-05-22 09:23:56

标签: ios exc-bad-access

一个简单的测试 -

- (void)viewDidLoad
{
    [super viewDidLoad];

    date2 = [NSDate dateWithTimeIntervalSinceNow:3];
    myTimer = [NSTimer scheduledTimerWithTimeInterval:1
                                                   target:self
                                         selector:@selector(timerFires)
                                                 userInfo:nil
                                                  repeats:YES];

}

- (void)timerFires{
    date1 = [NSDate date];
    NSTimeInterval timeBetween = [date1 timeIntervalSinceDate:date2];
    NSLog(@"follow: %f", timeBetween);  
}

在“timerFires”中导致“EXC_BAD_ACCESS”错误

Thread 1: Program received signal: "EXC_BAD_ACCESS".

我在.h文件中声明了'date1''date2'和'myTimer'。

似乎 - (void)timerFires无法获得'date2'的值。 你能帮我解决一下吗?

2 个答案:

答案 0 :(得分:0)

在执行date2 = [NSDate dateWithTimeIntervalSinceNow:3];时,您要将自动释放的对象分配给date2。这是在计时器触发之前释放的。如果要在其他地方使用它,则必须retain该对象。这样做 -

date2 = [[NSDate dateWithTimeIntervalSinceNow:3] retain];

请记住,因为你保留了这个,所以你需要在之后发布它。

答案 1 :(得分:0)

我猜你的日期变量并没有停留,因为你从未明确地保留它们。 [NSDate dateWithTimeIntervalSinceNow:3]返回一个自动释放的对象。你是否将日期实例变量声明为保留的属性并合成其getter和setter?例如,在您的界面文件中:

@interface MyClass {
   NSDate *date1;
   NSDate *date2;
}

@property (nonatomic, retain) NSDate *date1;
@property (nonatomic, retain) NSDate *date2;

然后在您的实现文件中:

@implementation
@synthesize date1, date2

然后您应该使用self访问它们,以便正确保留它们:

self.date2 = [NSDate dateWithTimeIntervalSinceNow:3];