NSTimer вылетает - PullRequest
       1

NSTimer вылетает

2 голосов
/ 23 ноября 2011

Я искал ответ, и у меня ничего не работает.

У меня есть NSTimer в качестве атрибута Appdelegate, этот NSTimer должен запускать свое действие в любое время, даже когда приложение находится в фоновом режиме (это приложение локализации - так что оно может работать вечно)

Это код:

if(conectar){
            self.myTimer = [[NSTimer scheduledTimerWithTimeInterval:10.0
                                                            target:self
                                                          selector:@selector(abrirPresencia)
                                                          userInfo:nil
                                                           repeats:NO]retain];
        }
        else{
            self.myTimer = [[NSTimer scheduledTimerWithTimeInterval:10.0
                                                    target:self
                                                  selector:@selector(cerrarPresencia)
                                                  userInfo:nil
                                                           repeats:NO]retain];
        }

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

Вот методы:

-(void)cerrarPresencia{
NSLog(@"SOY EL TIMERRRRR!!!! %@");
//[[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground
if (YES){
    [self.location stopUpdatingLocation];
    [self disconnect];

}
else{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Ups!"
                                                        message:@"Según tu perfil querrías estar desconectado pero como lo estás usando hemos incluido este horario. Para cambiarlo sólo tienes que ir a editar perfil."
                                                       delegate:self 
                                              cancelButtonTitle:@"Ok" 
                                              otherButtonTitles:nil];
    [alertView show];

    [alertView release];
}

}

-(void)abrirPresencia{
NSLog(@"SOY EL TIMERRRRR!!!! %@");
if (YES){
    [self.location stopUpdatingLocation];
    [self disconnect];

}
else{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Ups!"
                                                        message:@"Según tu perfil querrías estar desconectado pero como lo estás usando hemos incluido este horario. Para cambiarlo sólo tienes que ir a editar perfil."
                                                       delegate:self 
                                              cancelButtonTitle:@"Ok" 
                                              otherButtonTitles:nil];
    [alertView show];

    [alertView release];
}

}

А это свойство:

@property (nonatomic, retain)NSTimer *myTimer;

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011
NSLog(@"SOY EL TIMERRRRR!!!! %@");

Помните, что предупреждение о компиляторе, которое вы получили в этой строке с надписью

предупреждение: больше «%» преобразований, чем аргументов данных [-Wformat, 7]

Обратите внимание на эти предупреждения. Вы вызываете NSLog с аргументом, который включает спецификатор формата %@, и это заставляет думать, что будут дополнительные аргументы. Если вы не передадите эти дополнительные аргументы, функция по-прежнему будет искать в том месте, где она ожидает аргумент, находит ненужные и вызывает сбой.

2 голосов
/ 23 ноября 2011

Селектор неправильный, он должен иметь следующую форму:

- (void) abrirPresencia:(NSTimer*)theTimer

Также селектору необходимо указать аргумент с конечным двоеточием: selector:@selector(abrirPresencia)

Из документов Apple API:

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

Сообщение, которое нужно отправить цели, когда срабатывает таймер.Селектор должен иметь следующую подпись:

- (void)timerFireMethod:(NSTimer*)theTimer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...