iOS程序啟動(dòng)原理_第1頁
iOS程序啟動(dòng)原理_第2頁
iOS程序啟動(dòng)原理_第3頁
iOS程序啟動(dòng)原理_第4頁
iOS程序啟動(dòng)原理_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、iOS程序啟動(dòng)原理技術(shù)博客http:/ UIApplicationMain(int argc, char *argv, NSString *principalClassName, NSString *delegateClassName)uargc、argv:ISO C標(biāo)準(zhǔn)main函數(shù)的參數(shù),直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可uprincipalClassName:指定應(yīng)用程序類,該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認(rèn)值udelegateClassName:指定應(yīng)用程序類的代理類,該類必須遵守UIAppli

2、cationDelegate協(xié)議UIApplicationMainl此函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對(duì)象,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對(duì)象,并將該delegate對(duì)象賦值給UIApplication對(duì)象中的delegate屬性lUIApplication對(duì)象會(huì)依次給delegate對(duì)象發(fā)送不同的消息,接著會(huì)建立應(yīng)用程序的main runloop(事件循環(huán)),進(jìn)行事件的處理(首先會(huì)調(diào)用delegate對(duì)象的 application:didFinishLaunchingWithOptions:)l程序正常退出時(shí)這個(gè)函數(shù)

3、才返回。如果進(jìn)程要被系統(tǒng)強(qiáng)制殺死,一般這個(gè)函數(shù)還沒來得及返回進(jìn)程就終止了四大對(duì)象關(guān)系圖*.xibUIApplicationDelegate.windowUIApplication.delegateUIWindow.rootViewControllerUIViewController.viewiOS中的mvcUIApplicationlUIApplication是應(yīng)用程序的核心,每一個(gè)程序在運(yùn)行期必須有UIApplication(或子類)的一個(gè)實(shí)例(有且僅有一個(gè)),通過UIApplication sharedApplication可以得到這個(gè)單例實(shí)例的指針lUIApplication幫助管理應(yīng)用

4、程序的生命周期,而它通過delegate來履行這個(gè)任務(wù)lUIApplication可以接收事件,把所有用戶事件都放入隊(duì)列,逐個(gè)處理,它會(huì)發(fā)送當(dāng)前事件給一個(gè)合適的目標(biāo)控件進(jìn)行處理。它還將部分事件轉(zhuǎn)給delegate對(duì)象來處理,delegate可處理的事件包括:應(yīng)用程序的生命周期事件(如程序啟動(dòng)和關(guān)閉)、系統(tǒng)事件(如來電)UIApplicationlUIApplication sharedApplication.windows: 在本應(yīng)用中打開的UIWindow列表,這樣就可以接觸應(yīng)用中的任何一個(gè)UIView對(duì)象lUIApplication sharedApplication.keyWindow:

5、 用來接收鍵盤以及非觸摸類的消息事件的UIWindow,而且程序中每個(gè)時(shí)刻只能有一個(gè)UIWindow是keyWindow。如果某個(gè)UIWindow內(nèi)部的文本框不能輸入文字,可能是因?yàn)檫@個(gè)UIWindow不是keyWindowUIApplicationDelegatel在開發(fā)過程中,UIApplication是一個(gè)非常重要的全局對(duì)象。但在實(shí)際編程中我們并不直接和UIApplication對(duì)象打交道,而是和其代理打交道,它的代理必須遵守UIApplicationDelegate協(xié)議,代理提供了相關(guān)的生命周期方法來處理應(yīng)用程序的系統(tǒng)事件lios設(shè)備的內(nèi)存極其優(yōu)先,如果為app分配了太多內(nèi)存,操作系統(tǒng)

6、會(huì)終止app的運(yùn)行,在UIApplication接收到這個(gè)事件后它會(huì)調(diào)用代理的applicationDidReceiveMemoryWarning方法,代理在這個(gè)方法內(nèi)可以進(jìn)行釋放內(nèi)存的操作以防止操作系統(tǒng)強(qiáng)制終止應(yīng)用程序的運(yùn)行UIApplicationDelegatelios并不是多任務(wù)的操作系統(tǒng),所以app很容易受到打擾。比如一個(gè)來電可能導(dǎo)致app失去焦點(diǎn),如果這個(gè)時(shí)候接聽了電話,那么app會(huì)自動(dòng)終止運(yùn)行l(wèi)還有很多其它類似的事件會(huì)導(dǎo)致app失去焦點(diǎn)uapp失去焦點(diǎn)前會(huì)調(diào)用代理的applicationWillResignActiveuapp再次獲取焦點(diǎn)時(shí)會(huì)調(diào)用代理的applicationDid

7、BecomeActiveu在運(yùn)行app時(shí)鎖屏?xí){(diào)用代理的applicationWillResignActiveu當(dāng)屏幕被解鎖時(shí),會(huì)調(diào)用代理的applicationDidBecomeActiveUIWindowlUIWindow是一種特殊的UIView,通常在一個(gè)app中只會(huì)有一個(gè)UIWindow,但可以手動(dòng)創(chuàng)建多個(gè)UIWindowlUIWindow的主要作用:(1)提供一個(gè)區(qū)域來顯示視圖(2)將事件分發(fā)給視圖(3)與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持UIWindowl添加UIView到UIWindow中兩種常見方式:(1)addSubview:直接將UIVie

8、w添加到UIWindow中,程序負(fù)責(zé)維護(hù)UIView的生命周期以及刷新,但并不會(huì)理會(huì)UIView對(duì)應(yīng)的UIViewController(2)rootViewController:自動(dòng)將UIViewController對(duì)應(yīng)的UIView添加到UIWindow中,同時(shí)負(fù)責(zé)維護(hù)UIViewController和UIView的生命周期l常用方法(1)makeKeyWindow:讓當(dāng)前UIWindow變成keyWindow(2)makeKeyAndVisible:讓當(dāng)前UIWindow變成keyWindow,并顯示出來UIViewControllerlUIViewController屬于MVC模型中的C

9、(Controller),說的更具體點(diǎn)它是一個(gè)視圖控制器,管理著一個(gè)視圖(UIView)l一個(gè)UIViewController應(yīng)該只管理一個(gè)view hierarchy,通常來說一個(gè)完整的view hierarchy指的是占滿整一個(gè)屏幕。而很多app滿屏中會(huì)有各個(gè)區(qū)域分管不同的功能,一些開發(fā)者喜歡直接新建一個(gè)UIViewController和一套相應(yīng)的view來完成所要的功能,這樣做完全不符合Apple提供的設(shè)計(jì)規(guī)范UIViewController的viewl可以利用xib文件來初始化view; 也可以使用自定義的view,那就必須覆蓋loadView方法來創(chuàng)建這個(gè)viewlUIViewCon

10、troller的view是lazy loading的,當(dāng)你訪問其view屬性時(shí),view會(huì)從xib文件載入或者通過代碼創(chuàng)建(覆蓋loadView方法,自定義其view hierarchy) l可以用isViewLoaded方法判斷一個(gè)UIViewController的view是否已經(jīng)被加載UIViewController生命周期方法的調(diào)用l當(dāng)view加載后調(diào)用viewDidLoad,這里可以進(jìn)行一些數(shù)據(jù)的請(qǐng)求或加載,用來更新界面l當(dāng)view將要被加入view hierarchy時(shí)調(diào)用viewWillAppear,完成加入時(shí)調(diào)用viewDidAppearl當(dāng)view將要從view hierarc

11、hy中移除時(shí)調(diào)用viewWillDisappear,完成移除時(shí)調(diào)用viewDidDisappearl當(dāng)內(nèi)存緊張時(shí), 調(diào)用didReceiveMemoryWarning,其默認(rèn)實(shí)現(xiàn)是如果當(dāng)前UIViewController的view的superview是nil,則將view釋放且調(diào)用viewDidUnload, viewDidUnload中你可以進(jìn)行后繼的內(nèi)存清理工作(主要是界面元素的釋放,當(dāng)再次加載的時(shí)候需要重建)(這里的view是指UIViewController內(nèi)部的view屬性)工程名-Info.plistl建立一個(gè)工程后,會(huì)在Supporting files文件夾下看到一個(gè)”工程名-I

12、nfo.plist”的文件,該文件對(duì)工程做一些運(yùn)行期的配置,很重要,不能刪除l在舊版本Xcode創(chuàng)建的工程中,這個(gè)配置文件的名字就叫”Info.plist”l如果使用文本編輯器打開這個(gè)文件,會(huì)發(fā)現(xiàn)這是一個(gè)XML格式的文本文件,一般不用文本編輯器直接編輯這個(gè)文件,而是通過Xcode編輯l項(xiàng)目中還有一個(gè)InfoPlist.strings的文件,跟Info.plist文件的本地化相關(guān)工程名-Info.plistl常見屬性(紅色部分是用文本編輯器打開時(shí)看到的key)uLocaliztion native development region(CFBundleDevelopmentRegion)-本地化

13、相關(guān)uBundle display name(CFBundleDisplayName)-程序安裝后顯示的名稱,限制在1012個(gè)字符,如果超出,將被顯示縮寫名稱uIcon file(CFBundleIconFile)-app圖標(biāo)名稱,一般為Icon.pnguBundle version(CFBundleVersion)-應(yīng)用程序的版本號(hào),每次往App Store上發(fā)布一個(gè)新版本時(shí),需要增加這個(gè)版本號(hào)uMain nib file base name(NSMainNibFile)-主nib文件的名稱uBundle identifier(CFBundleIdentifier)-項(xiàng)目的唯一標(biāo)識(shí),部署到真

14、機(jī)時(shí)用到工程名-Prefix.pchl一般來說,可以將項(xiàng)目中經(jīng)常用到的一些頭文件放在這里來import,整個(gè)項(xiàng)目都可以訪問這個(gè)文件的內(nèi)容,這樣既節(jié)省了手動(dòng)添加import的時(shí)間,也有助于加速編譯l在這里定義的宏,整個(gè)項(xiàng)目都可以訪問l在pch文件中添加下列預(yù)處理指令,然后在項(xiàng)目中使用Log()來輸出日志信息,就可以在發(fā)布應(yīng)用的時(shí)候,一次性將NSLog語句移除(在調(diào)試模式下,才有定義DEBUG)#ifdef DEBUG#define Log(.) NSLog(_VA_ARGS_)#else#define Log(.) /* */#endif開發(fā)iOS6的注意liOS6新特性:auto layout

15、屬性,此屬性只針對(duì)iOS6及以上版本liOS6以下版本運(yùn)行時(shí)可能會(huì)出現(xiàn)的異常信息:Terminating app due to uncaught exception NSInvalidUnarchiveOperationException, reason: Could not instantiate class named NSLayoutConstraintu具體場(chǎng)景:Xcode 4.5 選擇iPhone/iPad 5.0/5.1 Simulator(模擬器)u解決辦法:需要關(guān)閉storyboard或xib界面文件的Use Autolayout 選項(xiàng),這是因?yàn)锳uto Layout特性是iO

16、S 6新增加的,在之前的 5.0/5.1 Simulator模擬器中不支持nib文件lnib文件是iOS中用來描述視圖的xml格式的文本文件,現(xiàn)在拓展名為xib,用Interface Builder打開可以生成圖形界面式的描述l某書中著名的一句話:Interface Builder把窗口、菜單欄以及窗口上的各種控件對(duì)象都”凍結(jié)”在一個(gè)NIB文件里;程序運(yùn)行時(shí),這些對(duì)象將會(huì)”蘇醒”l加載Nib文件時(shí),會(huì)將文件中的描述轉(zhuǎn)化為應(yīng)用程序可以操作的真正對(duì)象,所有在Interface Builder中建立的關(guān)聯(lián)(如Files Owner和其他對(duì)象之間的關(guān)聯(lián))都能夠在運(yùn)行時(shí)重新建立起來主nib文件l主nib

17、文件是指應(yīng)用程序一啟動(dòng)就裝載的nib文件,它的Files Owner一定要是個(gè)UIApplication(或子類),并且新建一個(gè)delegate對(duì)象、建立UIApplication和delegate對(duì)象的關(guān)聯(lián)主nib文件的設(shè)置方法1l在Info.plist通過NSMainNibFile這個(gè)key可以設(shè)置主nib文件主nib文件的設(shè)置方法2在Summary的Main Interface中設(shè)置UIViewlUIView是iOS中界面元素的基礎(chǔ),所有的界面元素都繼承它,可以說在iPhone中你能看到的、摸到的,都是UIViewlUIView的基本功能:(1)繪圖和動(dòng)畫(用CALayer和CAAnim

18、ation實(shí)現(xiàn))(2)事件處理(繼承了UIRsponder)l一個(gè)UIView可以包含和管理若干個(gè)子視圖,決定著子視圖的位置和大小UIView常用屬性lframe 在父視圖坐標(biāo)系中的位置(CGPoint origin)和大小(CGSize size)lbounds在本視圖坐標(biāo)系中的位置(CGPoint origin的x、y永遠(yuǎn)為0)和大小(CGSize size)lcenter視圖的中點(diǎn)在父視圖坐標(biāo)系中的位置lUIView *superview 父視圖lNSArray *subviews 所有的子視圖lUIWindow *window 當(dāng)前視圖所在的窗口lBOOL userInteractio

19、nEnabled YES代表接收觸摸事件UIKit坐標(biāo)系View1(0,0)View2(0,0)50706040View1是View2的父視圖View2.frame = x=70,y=50,width=60,height=40View2.bounds = x=0,y=0,width=60,height=40View2.center = (x=100, y=70)UIKit框架中的坐標(biāo)系都如左圖所示,視圖的左上角為原點(diǎn)(0,0),x軸向右正向延伸,y軸向下正向延伸View3中frame的x,y值:(1)如果綠色視圖是View3的父視圖,那么View3的x,y為紅色箭頭的長(zhǎng)度(1)如果View1是View3的父視圖,那么View3的x,y為藍(lán)色箭頭的寬度View3UIView常用方法和屬性l- (void)removeFromSu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論