Отсутствует NSDate в методе scheduleTimerWithTimeInterval? - PullRequest
0 голосов
/ 22 мая 2011

Простой тест -

- (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);  
}

Это вызывает ошибку "EXC_BAD_ACCESS" в "timerFires"

Thread 1: Program received signal: "EXC_BAD_ACCESS".

Я объявил «date1», «date2» и «myTimer» в файле .h.

Похоже - (void) timerFires не может получить значение date2. Не могли бы вы помочь мне исправить это, пожалуйста!

Ответы [ 2 ]

0 голосов
/ 22 мая 2011

Я предполагаю, что ваши переменные даты не останавливаются, потому что вы никогда не сохраняли их явно.[NSDate dateWithTimeIntervalSinceNow: 3] возвращает автоматически выпущенный объект.Вы объявляете переменные экземпляра даты как свойства, которые сохраняются, и синтезируете их методы получения и установки?например, в вашем файле интерфейса:

@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];
0 голосов
/ 22 мая 2011

При выполнении date2 = [NSDate dateWithTimeIntervalSinceNow:3]; вы присваиваете автоматически выпущенный объект date2. Это освобождается до срабатывания таймера. Вам придется retain объект, если вы хотите использовать его в другом месте. Так что сделай это -

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

Помните, что поскольку вы сохраняете это, вам нужно будет впоследствии выпустить его.

...