2011-10-19 69 views
4

我有一個應用程序在Snow Leopard服務器上運行幾天和幾周。 它使用-[NSRunLoop runUntilDate:]「暫停」十秒鐘,執行其任務,然後再次暫停。用下面的報告,運行了一個多小時,我的應用程序崩潰後:NSRunloop runUntilDate導致應用程序崩潰

崩潰報告

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000013 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Application Specific Information: 
objc_msgSend() selector name: release 

Thread 0 Crashed: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib     0x00007fff84cfef0c objc_msgSend + 40 
1 com.apple.CoreFoundation  0x00007fff84e363d1 __CFRunLoopDoSources0 + 1361 
2 com.apple.CoreFoundation  0x00007fff84e345c9 __CFRunLoopRun + 873 
3 com.apple.CoreFoundation  0x00007fff84e33d8f CFRunLoopRunSpecific + 575 
4 com.apple.Foundation   0x00007fff83e73b74 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 270 
5 com.apple.Foundation   0x00007fff83ebf19a -[NSRunLoop(NSRunLoop) runUntilDate:] + 78 

乍一看我還以爲我的NSRunLoop對象不再有效,因此release消息深處CF導致崩潰。但是,我不認爲這種情況是 我在之前獲得對currentRunLoop對象的引用。

死機時間在1到1.5小時之間不等,但我無法弄清楚是什麼導致了它。 任何意見或意見或調試的想法將不勝感激,因爲我不知道下一步該怎麼做。

編輯:解決問題 - 請參閱下面

+0

你可以從失敗的方法發佈一些代碼? – NJones

回答

3

我知道這並不能準確地回答你的問題我的答案,但是...

我不知道這是否是一種選擇,因爲沒有示例代碼,但是你有沒有考慮過NSTimer?它們非常易於使用,每隔n秒執行一次代碼。

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(timerTarget:) userInfo:nil repeats:YES]; 

其中myTimer是你的類的NSTimer屬性。

當你完成,並希望沒有更多的電話。

[self.myTimer invalidate]; 
self.myTimer = nil; 
+0

謝謝 - 我知道NSTimer,我在其他應用程序中使用它。這當然是解決方案之一,但我更願意找出NSRunLoop有什麼問題,或者是我的代碼中的其他內容。 – helioz

3

進一步的測試使我能夠回答我的問題:

沒有什麼不對的運行循環。它是處理釋放autorelease池中的對象的運行循環,這就是爲什麼來自代碼的任何部分的問題都可以顯示與運行循環相關。

在我的情況下,我有一個對象沒有正確清理。在正常情況下,內存泄漏測試期間會出現這個問題。但是,這個特定的問題只出現在實際的客戶端安裝上,當一個SMTP服務器返回一個意外的錯誤信息,導致一個對象被「遺留」,並且當運行循環最終試圖清理它時,它就陷入了癱瘓。

短答案

在運行循環崩潰可以通過在代碼中的任何對象所引起的。嘗試重新創建問題場景並測試內存泄漏以找到違規者。