IOS開發學習筆記(五)
++應用生命周期(5種狀態)+
* 未運行(Not Running):在設備打開的狀態下,只有遇到下面三種情況的時候才返回返回該狀態;* 應用的[http://plist.info](http://plist.info/)包含UIApplicationExistsOnSuspend(並且設值為YES);應用之前被掛起且系統需要清除一些內存;應用在運行過程中崩潰;
不活躍(Inactive):應用僅在其他狀態間臨時過渡階段處於不活躍狀態。應用右在任意時間內處於不活躍狀態的唯一前提是,用戶正在處理系統提示(如通話或簡訊)或用戶鎖定了屏幕。這基本上是一種中間過渡狀態。向活躍狀態過渡;
* 活躍(Active):應用在屏幕顯示時的正常運行狀態,可接收用戶輸入並更新顯示;
* 後台(Background):在此狀態,應用獲得了一些時間來執行一些代碼,但無法直接訪問屏幕或獲取任何用戶輸入。在用戶按下Home鍵後不久就會進行此狀態,大部分會迅速進入掛起狀態。需要在後台執行各種操作的應用會一直牌此狀態,直到被再次激活;
* 掛起(Suspended):掛起的應用被凍結執行;普通應用在處於後台後不久就會轉變為此狀態。應用在活躍之前所有內存將原封不動的得以保留;若用戶切換回活躍狀態,將恢復到之前的狀態。若系統需要為當前活躍的應用提供更多內存,任何掛起的應用都可能被終結(並返回到未運行狀態)。
點擊HOME鍵後的生命周期方法:通過工程屬性文件(info.plist)中的Application does not run in background的值(對應的鍵是UIApplicationExitsOnSuspend)來決定在按下home鍵後app是否在後台運行;
對應的生命周期方法及通知:
—>通知:UIApplicationDidFinishLaunchingNotification:
方法:didFinishLaunchingWithOptions:
—>通知:UIApplicationDidBecomeActiveNotification:
方法:applicationDidBecomeActive:
—>通知:UIApplicationWillResignActiveNotification:
方法:applicationWillResignActive::
—>通知:UIApplicationDidEnterBackgroundNotification:
方法:applicationDidEnterBackground:
—>通知:UIApplicationWillEnterForegroundNotification:
方法:applicationWillEnterForeground:
—>通知:UIApplicationWillTerminateNotification:
方法:applicationWillTerminate:
其他說明:
【應用處於掛起狀態所佔用的資源越少,該應用被ios終止的風險就越低。通過從內存中清理那些易於創建的資源,可增加應用駐留內存的機會,也要加快應用重啟速度】
applicationWillEnterForeground:從不活躍切換到後台狀態所執行的任何操作。(可從這裡重建持久網路連接);
從不活躍到後台,只有5秒時候來做保存操作;
- (void)applicationDidEnterBackground
{
NSLog(@"VC: %@", NSStringFromSelector(_cmd));
UIApplication *app = [UIApplication sharedApplication];
//用一個系統標識符來保存進入後台要執行的操作,以供後續使用
__block UIBackgroundTaskIdentifier taskId;
taskId = [app beginBackgroundTaskWithExpirationHandler:^{
//該方法是告訴系統需要更多時間來完成某件事情,並承諾在完成後通知系統;若系統認為我們運行的太長了並決定停止運行就可以調用該block下的程序
NSLog(@"Background task ran out of time and was terminated.");
//運行完成後告訴系統可以進入後台,但這裡的taskId一定要和前面定義的taskId匹配。
[app endBackgroundTask:taskId];
}];
//由於系統可能不會分配時間以做操作,一般可建立多個後台任務,並為每個任務請求一個標識符,並允許每項任務在後台隊列是繼續運行。
if (taskId == UIBackgroundTaskInvalid) {
//表示系統沒有為提供任何多餘的時間,在這種情況下可嘗試完成必須完成的操作中最快的部分並希望能在應用終止前完成
NSLog(@"Failed to start background task!");
return;
}
++ 手勢操作 ++
Cocoa Touch沒有公開任何代表手勢的類或結構;手勢通過一系列事件在系統內部傳遞信息。(UIGestureRecognizer)類及其各種子類封裝了大量手勢功能。
響應者鏈:(類似android的事件傳遞),UIResponder—>UIView—>UIControl—>UIViewController;
視圖或控制項是第一個響應者,若不處理該事件則向上傳遞,若已處理則消費。若都沒有處理最後傳遞到UIApplication,若UIApplication也沒有處理,則傳遞到UIApplicaitonDelegate;
4個手勢通知方法:
-(void)touchesBeganNSSet<UITouch *> *)touches withEventUIEvent *)event{
//touches中對象數確定當前按壓屏幕的手指數量;touches中的每個對象都是一個UITouch事件
//取出任意一個事件對象通過tapCount返回當前UITouch事件輕點屏幕的次數;
NSInteger numTaps = [[touches anyObject] tapCount];
//若numTouches為2表示兩個手指輕點了屏幕一次;若每個touch的tapCount都為2,就表示兩個手指進行了雙擊操作。
NSUInteger numTouches = [touches count];
//touches中的所有對象都可能實現該方法的視圖或視圖控制器的方法。
//通過事件也可獲取 一個子集,但它僅擁有特殊視圖中觸摸的touches;
NSSet *myTouchs = [event touchesForView:self.view];
}
-(void)touchesMovedNSSet<UITouch *> *)touches withEventUIEvent *)event{}
-(void)touchesEndedNSSet<UITouch *> *)touches withEventUIEvent *)event{}
-(void)touchesCancelledNSSet<UITouch *> *)touches withEventUIEvent *)event{};//該方法是諸如來電打斷觸摸方法時會調用;
* 監聽幾個手指滑動使用UISwipeGestureRecognizer
* 監聽單擊,雙擊,三擊等點擊方法,使用UITapGestureRecognizer;
* 監聽捏合使用UIPinchGestureRecognizer;(連續手勢識別器)doPinch:
* 監聽旋轉手勢使用UIRotationGestureRecognizer;doRotation:
* 監聽搖動或拖拽手勢UIPanGestureRecognizer;
* 監聽長按UILongPressGestureRecognizer;
* 自定義手勢:實現UIGestureRecognizer並重寫四個touch方法即可;
推薦閱讀: