版本記錄
| 版本號(hào) | 時(shí)間 |
|---|---|
| V1.0 | 2018.05.31 |
前言
我們在做一個(gè)APP時(shí)候需要注意哪些方面呢,接下來我們就看一下APP編程指南。里面有些可能大家在平時(shí)編程中都經(jīng)歷過,但是再系統(tǒng)的了解下也不是壞事。感興趣的可以看上面寫的幾篇。
1. APP編程指南 (一) —— 基本概覽(一)
2. APP編程指南 (二) —— 應(yīng)用程序必須實(shí)現(xiàn)的行為(一)
3. APP編程指南 (三) —— 應(yīng)用程序的后臺(tái)執(zhí)行(一)
Strategies for Handling App State Transitions - 處理應(yīng)用程序狀態(tài)轉(zhuǎn)換的策略
對于應(yīng)用程序的每種可能的運(yùn)行時(shí)狀態(tài),當(dāng)您的應(yīng)用程序處于該狀態(tài)時(shí),系統(tǒng)會(huì)有不同的期望。 當(dāng)狀態(tài)轉(zhuǎn)換發(fā)生時(shí),系統(tǒng)會(huì)通知應(yīng)用程序?qū)ο螅缓笸ㄖ獞?yīng)用程序代理。 您可以使用UIApplicationDelegate協(xié)議的狀態(tài)轉(zhuǎn)換方法來檢測這些狀態(tài)更改并作出適當(dāng)?shù)捻憫?yīng)。 例如,當(dāng)從前臺(tái)轉(zhuǎn)換到后臺(tái)時(shí),您可以寫出任何未保存的數(shù)據(jù)并停止正在進(jìn)行的任務(wù)。 以下各節(jié)提供了有關(guān)如何實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換代碼的提示和指導(dǎo)。
What to Do at Launch Time - 啟動(dòng)時(shí)要做什么
當(dāng)您的應(yīng)用程序啟動(dòng)時(shí)(無論是前臺(tái)還是后臺(tái)),請使用您的應(yīng)用程序委托application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法執(zhí)行以下操作:
- 檢查啟動(dòng)選項(xiàng)字典的內(nèi)容,了解啟動(dòng)應(yīng)用程序的原因,并做出適當(dāng)?shù)捻憫?yīng)。
- 初始化您的應(yīng)用的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
- 準(zhǔn)備您的應(yīng)用的窗口和視圖以供顯示:
- 使用
OpenGL ES進(jìn)行繪圖的應(yīng)用程序不得使用這些方法來準(zhǔn)備繪圖環(huán)境。相反,將任何OpenGL ES繪圖調(diào)用推遲到applicationDidBecomeActive:方法。 - 在
application:willFinishLaunchingWithOptions:方法中顯示你的app窗口。 UIKit延遲使窗口,直到application:didFinishLaunchingWithOptions:方法返回才可見。
- 使用
在啟動(dòng)時(shí),系統(tǒng)會(huì)自動(dòng)加載您的應(yīng)用程序的主要storyboard文件并加載初始視圖控制器。對于支持狀態(tài)恢復(fù)的應(yīng)用程序,狀態(tài)恢復(fù)機(jī)制會(huì)將您的界面恢復(fù)到調(diào)用application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法之間的狀態(tài)。使用application:willFinishLaunchingWithOptions:方法來顯示您的應(yīng)用程序窗口,并確定是否應(yīng)該發(fā)生狀態(tài)恢復(fù)。使用application:didFinishLaunchingWithOptions:方法對應(yīng)用程序的用戶界面進(jìn)行最終調(diào)整。
您的application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法應(yīng)該始終盡可能輕量級(jí)以減少應(yīng)用程序的啟動(dòng)時(shí)間。應(yīng)用程序需要啟動(dòng),初始化自己,并在不到5秒的時(shí)間內(nèi)開始處理事件。如果應(yīng)用程序沒有及時(shí)完成其啟動(dòng)周期,系統(tǒng)會(huì)因?yàn)闊o響應(yīng)而殺死它。因此,任何可能減慢啟動(dòng)速度的任務(wù)(例如訪問網(wǎng)絡(luò))都應(yīng)該安排在子線程上執(zhí)行。
1. The Launch Cycle - 啟動(dòng)周期
當(dāng)您的應(yīng)用程序啟動(dòng)后,它會(huì)從未運(yùn)行狀態(tài)轉(zhuǎn)換為活動(dòng)狀態(tài)或后臺(tái)狀態(tài),并在非活動(dòng)狀態(tài)中短暫轉(zhuǎn)換。 作為啟動(dòng)周期的一部分,系統(tǒng)會(huì)為您的應(yīng)用程序創(chuàng)建一個(gè)進(jìn)程和主線程,并在該主線程上調(diào)用您的main函數(shù)。 Xcode項(xiàng)目附帶的默認(rèn)main函數(shù)會(huì)立即將控制權(quán)移交給UIKit框架,UIKit框架完成初始化應(yīng)用程序并準(zhǔn)備運(yùn)行的大部分工作。
Figure 4-1顯示了將應(yīng)用程序啟動(dòng)到前臺(tái)時(shí)發(fā)生的事件序列,包括所調(diào)用的應(yīng)用程序代理方法。

當(dāng)您的應(yīng)用程序啟動(dòng)到后臺(tái)時(shí)(通常是為了處理某種類型的后臺(tái)事件),啟動(dòng)周期稍微改變?yōu)閳D4-2所示。 主要區(qū)別在于,您的應(yīng)用不是處于活動(dòng)狀態(tài),而是進(jìn)入后臺(tái)狀態(tài)以處理該事件,并可能在此之后的某個(gè)時(shí)刻暫停。 在啟動(dòng)到后臺(tái)時(shí),系統(tǒng)仍會(huì)加載應(yīng)用的用戶界面文件,但不會(huì)顯示應(yīng)用的窗口。

要確定您的應(yīng)用程序是啟動(dòng)到前臺(tái)還是后臺(tái),請檢查應(yīng)用程序application:willFinishLaunchingWithOptions:和 application:didFinishLaunchingWithOptions:代理方法中UIApplication對象的applicationState屬性。 當(dāng)應(yīng)用程序啟動(dòng)到前臺(tái)時(shí),此屬性包含值UIApplicationStateInactive。 當(dāng)應(yīng)用程序啟動(dòng)到后臺(tái)時(shí),該屬性將包含值UIApplicationStateBackground。 您可以使用此差異來相應(yīng)地調(diào)整代理方法的啟動(dòng)時(shí)行為。
注意:啟動(dòng)應(yīng)用程序以便它可以打開URL時(shí),啟動(dòng)事件的順序與圖4-1和圖4-2中所示的順序略有不同。 有關(guān)打開URL時(shí)發(fā)生的啟動(dòng)順序的信息,請參閱Handling URL Requests。
2. Launching in Landscape Mode - 在橫屏模式下啟動(dòng)
僅將橫向取向用于其界面的應(yīng)用程序必須明確要求系統(tǒng)以該方向啟動(dòng)應(yīng)用程序。通常,應(yīng)用程序?qū)⒁钥v向模式啟動(dòng),并根據(jù)需要旋轉(zhuǎn)其界面以匹配設(shè)備方向。對于同時(shí)支持縱向和橫向的應(yīng)用程序,請始終配置縱向模式的視圖,然后讓視圖控制器處理任何旋轉(zhuǎn)。但是,如果您的應(yīng)用支持橫向模式,但不支持縱向模式,請執(zhí)行以下任務(wù),使其初始以橫向模式啟動(dòng):
- 將
UIInterfaceOrientation鍵添加到應(yīng)用程序的Info.plist文件中,并將此鍵的值設(shè)置為UIInterfaceOrientationLandscapeLeft或UIInterfaceOrientationLandscapeRight。 - 在橫向模式下布置您的視圖,并確保其布局或自動(dòng)調(diào)整選項(xiàng)設(shè)置正確。
- 重寫您的視圖控制器的shouldAutorotateToInterfaceOrientation:方法,并為左或右橫向方向返回YES,縱向方向返回NO。
應(yīng)用程序應(yīng)始終使用視圖控制器
view controllers來管理其基于窗口的內(nèi)容。
Info.plist文件中的UIInterfaceOrientation鍵告訴iOS應(yīng)該配置應(yīng)用程序狀態(tài)欄的方向(如果顯示的話)以及任何視圖控制器在啟動(dòng)時(shí)管理的視圖的方向。 視圖控制器考慮這個(gè)鍵并設(shè)置他們要匹配的視圖初始方向。 使用此鍵相當(dāng)于在執(zhí)行applicationDidFinishLaunching:方法的早期調(diào)用UIApplication的setStatusBarOrientation:animated:方法。
3. Installing App-Specific Data Files at First Launch - 首次啟動(dòng)時(shí)安裝特定于應(yīng)用程序的數(shù)據(jù)文件
您可以使用應(yīng)用的首次啟動(dòng)周期來設(shè)置運(yùn)行所需的任何數(shù)據(jù)或配置文件。特定應(yīng)用程序的數(shù)據(jù)文件應(yīng)該在應(yīng)用程序沙箱的Library/Application Support/<bundleID>/,其中<bundleID>是您應(yīng)用程序的bundle identifier。您可以進(jìn)一步細(xì)分此目錄以根據(jù)需要組織您的數(shù)據(jù)文件。您也可以在其他目錄中創(chuàng)建文件,例如根據(jù)您的需要,將文件創(chuàng)建到應(yīng)用程序的iCloud容器目錄或本地Documents目錄。
如果您應(yīng)用的軟件包中包含您計(jì)劃修改的數(shù)據(jù)文件,請將這些文件復(fù)制出應(yīng)用軟件包并修改副本。您不得修改您的應(yīng)用包內(nèi)的任何文件。由于iOS應(yīng)用程序是經(jīng)過代碼簽名的,所以修改應(yīng)用程序包內(nèi)的文件會(huì)使應(yīng)用程序的簽名無效,并且會(huì)阻止您的應(yīng)用程序在將來啟動(dòng)。將這些文件復(fù)制到Application Support目錄(或沙箱中的另一個(gè)可寫目錄)并修改它們是安全使用這些文件的唯一方法。
有關(guān)應(yīng)用程序相關(guān)數(shù)據(jù)文件放置位置的更多信息,請參閱File System Programming Guide。
What to Do When Your App Is Interrupted Temporarily - 當(dāng)你的應(yīng)用程序暫時(shí)中斷時(shí)該怎么辦
Alert-based的中斷會(huì)導(dǎo)致您的應(yīng)用程序暫時(shí)失去控制權(quán)。 您的應(yīng)用繼續(xù)在前臺(tái)運(yùn)行,但不會(huì)從系統(tǒng)接收觸摸事件。 (盡管如此,它仍會(huì)繼續(xù)接收通知和其他類型的事件,例如加速度計(jì)事件。)為了響應(yīng)此更改,您的應(yīng)用程序應(yīng)在applicationWillResignActive:方法中執(zhí)行以下操作:
- 保存數(shù)據(jù)和任何相關(guān)的狀態(tài)信息。
- 停止定時(shí)器和其他周期性任務(wù)。
- 停止正在運(yùn)行的元數(shù)據(jù)查詢
- 不要發(fā)起任何新的任務(wù)。
- 暫停電影播放(除通過
AirPlay播放外)。 - 如果您的應(yīng)用是游戲,請進(jìn)入暫停狀態(tài)。
- 縮小
OpenGL ES幀速率。 - 掛起執(zhí)行非關(guān)鍵代碼的任何調(diào)度隊(duì)列或操作隊(duì)列。 (您可以在不活動(dòng)時(shí)繼續(xù)處理網(wǎng)絡(luò)請求和其他時(shí)間敏感的后臺(tái)任務(wù)。)
當(dāng)您的應(yīng)用程序移回活動(dòng)狀態(tài)時(shí),其applicationDidBecomeActive:方法應(yīng)該顛倒applicationWillResignActive:方法中采取的任何步驟。因此,重新激活后,您的應(yīng)用程序應(yīng)重新啟動(dòng)計(jì)時(shí)器,恢復(fù)調(diào)度隊(duì)列,并再次提高OpenGL ES幀速率。但是,游戲不應(yīng)該自動(dòng)恢復(fù);他們應(yīng)該保持暫停,直到用戶選擇恢復(fù)他們。
當(dāng)用戶按下Sleep/Wake按鈕時(shí),帶有受NSFileProtectionComplete保護(hù)選項(xiàng)保護(hù)的文件的應(yīng)用程序必須關(guān)閉對這些文件的任何引用。對于配置了適當(dāng)密碼的設(shè)備,按下Sleep/Wake按鈕將鎖定屏幕,并強(qiáng)制系統(tǒng)丟棄啟用了完整保護(hù)的文件的解密密鑰。當(dāng)屏幕鎖定時(shí),任何訪問相應(yīng)文件的嘗試都將失敗。所以,如果你有這樣的文件,你應(yīng)該在你的applicationWillResignActive:方法中關(guān)閉對它們的引用,并在你的applicationDidBecomeActive:方法中打開新的引用。
重要提示:始終將用戶數(shù)據(jù)保存在應(yīng)用程序的適當(dāng)檢查點(diǎn)。 雖然您可以使用應(yīng)用程序狀態(tài)轉(zhuǎn)換來強(qiáng)制對象將未保存的更改寫入磁盤,但不要等待應(yīng)用程序狀態(tài)轉(zhuǎn)換以保存數(shù)據(jù)。 例如,管理用戶數(shù)據(jù)的視圖控制器應(yīng)該在數(shù)據(jù)被
dismiss時(shí)保存其數(shù)據(jù)。
1. Responding to Temporary Interruptions - 應(yīng)對臨時(shí)中斷
當(dāng)發(fā)生alert-based的中斷時(shí)(例如來電),應(yīng)用程序會(huì)暫時(shí)移至非活動(dòng)狀態(tài),以便系統(tǒng)可以提示用戶如何進(jìn)行操作。 應(yīng)用程序保持此狀態(tài),直到用戶解除警報(bào)。 此時(shí),應(yīng)用程序會(huì)返回到活動(dòng)狀態(tài)或移動(dòng)到后臺(tái)狀態(tài)。 圖4-3顯示了當(dāng)發(fā)生基于警報(bào)的中斷時(shí),通過您的應(yīng)用程序發(fā)生的事件流。

顯示橫幅banner的通知不會(huì)像基于警報(bào)的通知的方式停用您的應(yīng)用。相反,橫幅沿著您的應(yīng)用程序窗口的頂部邊緣放置,您的應(yīng)用程序?qū)⒗^續(xù)像以前一樣接收觸摸事件。但是,如果用戶拉下橫幅以顯示通知中心,則您的應(yīng)用將移至非活動(dòng)狀態(tài),就像發(fā)生基于警報(bào)的中斷一樣。您的應(yīng)用會(huì)保持非活動(dòng)狀態(tài)直到用戶關(guān)閉通知中心或啟動(dòng)其他應(yīng)用程序。此時(shí),您的應(yīng)用程序會(huì)移至相應(yīng)的活動(dòng)或后臺(tái)狀態(tài)。用戶可以使用Settings設(shè)置來配置哪些通知顯示橫幅,哪些顯示alert。
按下Sleep/Wake按鈕是另一種類型的中斷,會(huì)導(dǎo)致您的應(yīng)用暫時(shí)停用。當(dāng)用戶按下此按鈕時(shí),系統(tǒng)禁用觸摸事件,將應(yīng)用程序移動(dòng)到后臺(tái),將應(yīng)用程序的applicationState屬性的值設(shè)置為UIApplicationStateBackground,并鎖定屏幕。鎖定的屏幕對使用數(shù)據(jù)保護(hù)來加密文件的應(yīng)用程序有額外的后果。這些結(jié)果在What to Do When Your App Is Interrupted Temporarily中有描述。
What to Do When Your App Enters the Foreground - 當(dāng)您的應(yīng)用程序進(jìn)入前臺(tái)時(shí)該怎么做
回到前臺(tái),您的應(yīng)用程序有機(jī)會(huì)重新啟動(dòng)它移至后臺(tái)時(shí)停止的任務(wù)。 移動(dòng)到前臺(tái)時(shí)發(fā)生的步驟如圖4-4所示。 applicationWillEnterForeground:方法應(yīng)該撤銷在applicationDidEnterBackground:方法中完成的任何操作,并且applicationDidBecomeActive:方法應(yīng)該繼續(xù)執(zhí)行與啟動(dòng)時(shí)相同的激活任務(wù)。

注意:UIApplicationWillEnterForegroundNotification通知也可用于跟蹤您的應(yīng)用何時(shí)重新進(jìn)入前臺(tái)。 您應(yīng)用中的對象可以使用默認(rèn)通知中心注冊此通知。
1. Be Prepared to Process Queued Notifications - 準(zhǔn)備處理排隊(duì)的通知
處于掛起狀態(tài)的應(yīng)用程序必須準(zhǔn)備好在返回到前臺(tái)或后臺(tái)執(zhí)行狀態(tài)時(shí)處理任何排隊(duì)的通知。暫停的應(yīng)用程序不會(huì)執(zhí)行任何代碼,因此無法處理與方向更改,時(shí)間更改,首選項(xiàng)更改以及會(huì)影響應(yīng)用程序外觀或狀態(tài)的許多其他方面有關(guān)的通知。為了確保這些更改不會(huì)丟失,只要系統(tǒng)重新開始執(zhí)行代碼(無論是在前臺(tái)還是后臺(tái)),系統(tǒng)就會(huì)排隊(duì)許多相關(guān)通知并將其發(fā)送到應(yīng)用程序。為了防止您的應(yīng)用在恢復(fù)時(shí)被通知重載,系統(tǒng)會(huì)合并事件并發(fā)送單個(gè)通知(每種相關(guān)類型),以反映應(yīng)用暫停后的凈變化。
表4-1列出了可以合并并傳送到您的應(yīng)用程序的通知。這些通知中的大部分都直接發(fā)送給注冊的觀察員。有些與設(shè)備方向更改相關(guān)的內(nèi)容通常會(huì)被系統(tǒng)框架攔截并以另一種方式傳遞給您的應(yīng)用

排隊(duì)的通知在您的應(yīng)用程序的主運(yùn)行循環(huán)中提供,并且通常在任何觸摸事件或其他用戶輸入之前交付。 大多數(shù)應(yīng)用程序應(yīng)該能夠快速處理這些事件,以便在恢復(fù)時(shí)不會(huì)引起任何明顯的延遲。 但是,如果您的應(yīng)用在從后臺(tái)狀態(tài)返回時(shí)顯示緩慢,請使用Instruments確定是否是您的通知處理程序代碼導(dǎo)致的延遲。
返回前臺(tái)的應(yīng)用程序還會(huì)接收自上次更新后標(biāo)記為臟的任何視圖的視圖更新通知。 在后臺(tái)運(yùn)行的應(yīng)用程序仍然可以調(diào)用setNeedsDisplay或setNeedsDisplayInRect:方法來請求更新其視圖。 但是,由于視圖不可見,因此只有在應(yīng)用程序返回到前臺(tái)后,系統(tǒng)才會(huì)合并請求并更新視圖。
2. Handle iCloud Changes - 處理iCloud更改
如果iCloud的狀態(tài)因任何原因而發(fā)生更改,系統(tǒng)會(huì)向您的應(yīng)用程序發(fā)送NSUbiquityIdentityDidChangeNotification通知。 當(dāng)用戶登錄或退出iCloud帳戶或啟用或禁用文檔和數(shù)據(jù)同步時(shí),iCloud狀態(tài)會(huì)發(fā)生變化。 此通知是您的應(yīng)用更新緩存以及任何與iCloud相關(guān)的用戶界面元素以適應(yīng)更改的提示。 例如,當(dāng)用戶注銷iCloud時(shí),應(yīng)該刪除對所有基于iCloud的文件或數(shù)據(jù)的引用。
如果您的應(yīng)用程序已經(jīng)提示用戶是否將文件存儲(chǔ)在iCloud中,則在iCloud狀態(tài)更改時(shí)不要再次提示。 在第一次提示用戶之后,將用戶的選擇存儲(chǔ)在應(yīng)用程序的本地偏好設(shè)置中。 然后,您可能希望使用Settings bundle或作為應(yīng)用中的選項(xiàng)公開該首選項(xiàng)。 但不要再次重復(fù)提示,除非該首選項(xiàng)當(dāng)前不在用戶默認(rèn)數(shù)據(jù)庫中。
3. Handle Locale Changes - 處理區(qū)域設(shè)置更改
如果用戶在應(yīng)用程序掛起時(shí)更改當(dāng)前區(qū)域設(shè)置,則可以使用NSCurrentLocaleDidChangeNotification通知在應(yīng)用程序返回到前臺(tái)時(shí)強(qiáng)制更新任何包含區(qū)域設(shè)置敏感信息(例如日期,時(shí)間和數(shù)字)的視圖。 當(dāng)然,避免與語言環(huán)境相關(guān)的問題的最好方法是以易于更新視圖的方式編寫代碼。 例如:
- 檢索
NSLocale對象時(shí)使用autoupdatingCurrentLocale類方法。 此方法返回一個(gè)區(qū)域設(shè)置對象,該對象會(huì)自動(dòng)更新以響應(yīng)更改,因此您不需要重新創(chuàng)建它。 但是,當(dāng)語言環(huán)境更改時(shí),您仍然需要刷新包含從當(dāng)前語言環(huán)境派生的內(nèi)容的視圖。 - 每當(dāng)當(dāng)?shù)卣Z言環(huán)境信息發(fā)生變化時(shí),重新創(chuàng)建任何緩存的日期和數(shù)字格式化程序?qū)ο蟆?/li>
有關(guān)使代碼國際化以處理區(qū)域設(shè)置更改的更多信息,請參閱Internationalization and Localization Guide。
4. Handle Changes to Your App’s Settings - 處理對應(yīng)用程序設(shè)置的更改
如果您的應(yīng)用具有由Settings應(yīng)用管理的設(shè)置,則應(yīng)該遵守NSUserDefaultsDidChangeNotification通知。由于用戶可以在應(yīng)用程序被暫?;蛟诤笈_(tái)修改設(shè)置,因此您可以使用此通知來響應(yīng)這些設(shè)置中的任何重要更改。在某些情況下,回復(fù)此通知可幫助消除潛在的安全漏洞。例如,電子郵件程序應(yīng)該響應(yīng)用戶帳戶信息的變化。未能監(jiān)視這些更改可能會(huì)導(dǎo)致隱私或安全問題。具體而言,即使該帳戶不再屬于該人,當(dāng)前用戶也可以使用舊帳戶信息發(fā)送電子郵件。
在收到NSUserDefaultsDidChangeNotification通知后,您的應(yīng)用程序應(yīng)重新加載任何相關(guān)設(shè)置,并在必要時(shí)適當(dāng)重置其用戶界面。在密碼或其他安全相關(guān)信息發(fā)生變化的情況下,您還應(yīng)該隱藏以前顯示的任何信息并強(qiáng)制用戶輸入新密碼。
What to Do When Your App Enters the Background - 當(dāng)您的應(yīng)用程序進(jìn)入后臺(tái)時(shí)應(yīng)該怎么做
從前臺(tái)移動(dòng)到后臺(tái)時(shí),請使用應(yīng)用程序委托的applicationDidEnterBackground:方法執(zhí)行以下操作:
-
Prepare to have your app’s picture taken - 準(zhǔn)備好拍攝您應(yīng)用的照片
- 當(dāng)
applicationDidEnterBackground:方法返回時(shí),系統(tǒng)會(huì)拍攝應(yīng)用程序用戶界面的圖片,并將結(jié)果圖像用于過渡動(dòng)畫。如果界面中的任何視圖包含敏感信息,則應(yīng)在applicationDidEnterBackground:方法返回之前隱藏或修改這些視圖。如果您將新視圖作為此過程的一部分添加到視圖層次結(jié)構(gòu)中,則必須強(qiáng)制這些視圖進(jìn)行繪制,如Prepare for the App Snapshot中所述。
- 當(dāng)
-
Save any relevant app state information - 保存任何相關(guān)的應(yīng)用狀態(tài)信息
- 在進(jìn)入后臺(tái)之前,您的應(yīng)用程序應(yīng)該已經(jīng)保存了所有重要的用戶數(shù)據(jù)。使用過渡到后臺(tái)來保存對應(yīng)用程序狀態(tài)的任何最后更改。
-
Free up memory as needed - 根據(jù)需要釋放內(nèi)存
- 釋放您不需要的任何緩存數(shù)據(jù),并執(zhí)行任何可能減少應(yīng)用內(nèi)存占用的簡單清理。具有大內(nèi)存占位符的應(yīng)用程序是系統(tǒng)首先終止的應(yīng)用程序,因此釋放不再需要的圖像資源,數(shù)據(jù)緩存和任何其他對象。有關(guān)更多信息,請參閱 Reduce Your Memory Footprint。
您的應(yīng)用程序代理的applicationDidEnterBackground:方法大約需要5秒來完成任何任務(wù)并返回。實(shí)際上,這種方法應(yīng)該盡快返回。如果該方法在時(shí)間耗盡之前未返回,則應(yīng)用程序?qū)⒈唤K止并從內(nèi)存中清除。如果您仍然需要更多時(shí)間來執(zhí)行任務(wù),請調(diào)用beginBackgroundTaskWithExpirationHandler:方法來請求后臺(tái)執(zhí)行時(shí)間,然后在輔助線程中啟動(dòng)任何長時(shí)間運(yùn)行的任務(wù)。無論您是否啟動(dòng)任何后臺(tái)任務(wù),applicationDidEnterBackground:方法仍必須在5秒內(nèi)退出。
注意:除了調(diào)用
applicationDidEnterBackground:方法之外,系統(tǒng)還會(huì)發(fā)送UIApplicationDidEnterBackgroundNotification通知。 您可以使用該通知將清理任務(wù)分配給應(yīng)用程序的其他對象。
根據(jù)應(yīng)用程序的功能,應(yīng)用程序在移動(dòng)到后臺(tái)時(shí)應(yīng)該執(zhí)行其他操作。 例如,任何有效的Bonjour服務(wù)應(yīng)該被暫停,應(yīng)用程序應(yīng)該停止調(diào)用OpenGL ES函數(shù)。 有關(guān)移動(dòng)到后臺(tái)時(shí)應(yīng)執(zhí)行的操作列表,請參閱Being a Responsible Background App。
1. The Background Transition Cycle - 后臺(tái)轉(zhuǎn)換周期
當(dāng)用戶按下Home按鈕,按下Sleep/Wake按鈕,或系統(tǒng)啟動(dòng)另一個(gè)應(yīng)用程序時(shí),前臺(tái)應(yīng)用程序?qū)⑥D(zhuǎn)換到非活動(dòng)狀態(tài),然后轉(zhuǎn)換到后臺(tái)狀態(tài)。 這些轉(zhuǎn)換導(dǎo)致調(diào)用應(yīng)用程序委托的applicationWillResignActive:和applicationDidEnterBackground:方法,如圖4-5所示。 從applicationDidEnterBackground:方法返回后,大多數(shù)應(yīng)用程序在不久之后移至?xí)簰鞝顟B(tài)。 請求特定后臺(tái)任務(wù)(例如播放音樂)或從系統(tǒng)請求一點(diǎn)額外執(zhí)行時(shí)間的應(yīng)用程序可能會(huì)繼續(xù)運(yùn)行一段時(shí)間。

2. Prepare for the App Snapshot - 準(zhǔn)備App快照
在應(yīng)用程序代理的applicationDidEnterBackground:方法返回后不久,系統(tǒng)會(huì)拍攝應(yīng)用程序窗口的快照。同樣,當(dāng)應(yīng)用程序被喚醒以執(zhí)行后臺(tái)任務(wù)時(shí),系統(tǒng)可能會(huì)拍攝新快照以反映任何相關(guān)更改。例如,當(dāng)應(yīng)用程序被喚醒以處理下載的項(xiàng)目時(shí),系統(tǒng)會(huì)拍攝新的快照,以便反映由于合并項(xiàng)目而導(dǎo)致的任何更改。系統(tǒng)在多任務(wù)界面中使用這些快照圖像來顯示您的應(yīng)用程序的狀態(tài)。
如果您在進(jìn)入后臺(tái)后對視圖進(jìn)行了更改,則可以調(diào)用主視圖的snapshotViewAfterScreenUpdates:方法以強(qiáng)制渲染這些更改。在視圖上調(diào)用setNeedsDisplay方法對于快照是無效的,因?yàn)榭煺帐窃谙乱粋€(gè)繪制周期之前拍攝的,因此可以防止渲染出任何更改。調(diào)用值為YES的snapshotViewAfterScreenUpdates:方法會(huì)立即更新快照機(jī)制使用的基礎(chǔ)緩沖區(qū)。
3. Reduce Your Memory Footprint - 減少你的內(nèi)存占用
在進(jìn)入后臺(tái)時(shí),每個(gè)應(yīng)用程序都應(yīng)釋放盡可能多的內(nèi)存。系統(tǒng)會(huì)嘗試盡可能多地將內(nèi)存中的應(yīng)用程序保存在內(nèi)存中,但是當(dāng)內(nèi)存不足時(shí),它會(huì)終止暫停的應(yīng)用程序來回收內(nèi)存。在后臺(tái)消耗大量內(nèi)存的應(yīng)用程序是第一批要終止的應(yīng)用程序。
實(shí)際上,您的應(yīng)用程序在不再需要時(shí)應(yīng)立即刪除對象的強(qiáng)引用。刪除強(qiáng)引用使編譯器能夠立即釋放對象,以便可以回收相應(yīng)的內(nèi)存。但是,如果要緩存某些對象以提高性能,則可以等到應(yīng)用程序轉(zhuǎn)換到后臺(tái)時(shí)再刪除對它們的引用。
盡快刪除強(qiáng)引用的對象的一些示例包括:
- 您創(chuàng)建的圖像對象。 (UIImage的某些方法返回圖像,其基礎(chǔ)圖像數(shù)據(jù)由系統(tǒng)自動(dòng)清除,有關(guān)詳細(xì)信息,請參閱UIImage Class Reference中的討論。)
- 大型媒體或數(shù)據(jù)文件,您可以從磁盤再次加載
- 您的應(yīng)用不需要的任何其他對象,并且可以在以后輕松地重新創(chuàng)建
為了幫助減少應(yīng)用程序的內(nèi)存占用量,當(dāng)您的應(yīng)用程序移動(dòng)到后臺(tái)時(shí),系統(tǒng)會(huì)自動(dòng)清除代表應(yīng)用程序分配的一些數(shù)據(jù)。
系統(tǒng)清除所有Core Animation圖層的后備存儲(chǔ)。這項(xiàng)工作不會(huì)從應(yīng)用程序中刪除應(yīng)用程序的圖層對象,也不會(huì)更改當(dāng)前的圖層屬性。它只是防止這些圖層的內(nèi)容出現(xiàn)在屏幕上,因?yàn)閼?yīng)用程序在后臺(tái)不應(yīng)該發(fā)生。
- 它刪除任何系統(tǒng)對緩存圖像的引用。
- 它刪除了對其他一些系統(tǒng)管理的數(shù)據(jù)高速緩存的強(qiáng)引用。
后記
本篇主要講述了處理應(yīng)用程序狀態(tài)轉(zhuǎn)換的策略,感興趣的給個(gè)贊或者關(guān)注~~~
