2011-11-23 125 views
2

我一直在尋找答案,我什麼都沒有工作。NSTimer崩潰

我有一個的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秒後應用程序崩潰,我有兩種方法斷點和它不停止,彷彿方法wasnt甚至呼籲,而不是射擊崩潰的方法。

這裏是方法:

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

}

,並且屬性是:

​​

任何想法?

+0

你可以發佈這些方法嗎?崩潰日誌中有什麼錯誤? – Vladimir

+0

如果您正在調用的方法有一個(或多個)參數,則應該在選擇器的末尾添加一個冒號:你可以做什麼@弗拉基米爾問和發佈的方法? – Warkst

+0

很可能這是一個SIGABRT。嘗試在選擇器名稱中添加「:」。例如:(cerrarPresencia :) – Vin

回答

3
NSLog(@"SOY EL TIMERRRRR!!!! %@"); 

請記住,編譯器警告您在這條線是說

警告了:更多的「%」的轉換比數據參數[-Wformat,7 ]

注意這些警告。你打電話給NSLog,其中包含一個格式說明符%@,這使得它認爲會有更多的參數。如果你沒有通過這些進一步的論證,該函數仍然在它期望的參數所在的位置,發現垃圾並導致崩潰。

+0

那先生,是非常有斑點! @David Shaikh,嘗試從兩種方法中刪除%@行並查看會發生什麼。如果您仍然崩潰,請包含崩潰日誌。 – Warkst

+0

好主!就是這樣!感謝大家,特別是@Josh Caswell – subharb

2

的選擇是錯誤的,它必須以這種形式:

- (void) abrirPresencia:(NSTimer*)theTimer

而且選擇需要指定一個尾隨冒號參數: selector:@selector(abrirPresencia)

從蘋果的API文檔:

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

定時器啓動時發送到目標的消息。選擇器必須具有以下特徵:

- (void)timerFireMethod:(NSTimer*)theTimer 
+0

我加了你的建議 的變化 - (空)cerrarPresencia:(*的NSTimer)theTimer { 選擇:@選擇(cerrarPresencia :) 我也得到了同樣的錯誤.... – subharb