2011-10-10 85 views
0

使用Objective C內存管理,我們有一條通用規則,即如果使用以下任何一種技術創建對象,則需要稍後釋放對象。你怎麼知道當你的應用程序睡眠時,任務是否在後臺執行?

  • 頁頭
  • 副本
  • mutableCopy

這個規則很簡單記住。我正在尋找一個類似的簡單規則來決定應用程序是否正在進行後臺處理。這樣的確定名單是否存在?

  • NSUrlRequest - 如果您發出請求,然後立即點擊主頁按鈕,是否有可能我的應用程序仍在處理服務器響應?
  • Timer - 您啓動了一個計時器,從現在開始1分鐘後啓動,但您在1分鐘過後才按下主頁按鈕。定時器是否仍然運行,是暫停還是取消?
  • For循環 - 你寫一個for循環做百萬次迭代。完成600,000次迭代後關閉應用程序。當應用程序休眠並重新打開應用程序時,剩下的400,000次迭代會發生什麼情況?
  • 等等...

有十幾個其他的事情,我想只要應用睡覺。我很擔心,因爲從我開始開發這款攝像機應用程序開始,我的電池壽命非常糟糕(一夜之間下降了50%)。也許這是巧合,或者照相機在應用程序正在睡覺時仍在錄製。

回答

1

它在一定程度上取決於包中的UIBackgroundModes標誌。你可以用它們告訴iOS你想繼續在後臺運行。您還可以使用beginBackgroundTaskWithExpirationHandler動態請求足夠的時間以繼續下載幾分鐘。

如果你什麼都不做,默認是暫停你的應用程序 - NSTimers在你回到前臺之前不會觸發。如果您在主線程中進行循環,您的應用程序將花費一點時間來完成它,但是沒有指定確切的時間量。如果主線程上的循環時間過長,即使您處於前臺,您的應用程序也會被終止。

我不是100%確定NSURLConnections會發生什麼,但我懷疑它們在默認情況下會被取消。

參見:

iPhoneOS Programming Guide (PDF), p. 65

至於你的電池問題,您的應用程序可以肯定是負責這一點。例如,GPS是一個臭名昭着的電池豬,特別是如果您繼續在後臺運行以播放音頻或進行其他處理。

相關問題