概述:
iOS是蘋(píng)果開(kāi)發(fā)的手持設(shè)備操作系統(tǒng)(iPhone,iPad,iPod touch,iPad mini)。
基于UNIX,層次架構(gòu):核心操作系統(tǒng)層(Core OS)—> 核心服務(wù)層(Core Services)—>媒體層(Media)—>可觸摸層(Cocoa Touch);
主要面對(duì)Cocoa Touch層;很多技術(shù)都是基于OC,底層很多框架是C開(kāi)發(fā)的;Cocoa Touch層中的UIKit框架,為應(yīng)用提供了各種可視化的組件如,窗口(UIWindow),視圖(UIView)和按鈕(UIButton);還提供了其他有用的框架,如拍照,照片,傳感器,陀螺儀等硬件支持框架。
iOS 可直接與底層硬件通信(區(qū)別與android是沒(méi)有虛擬機(jī));系統(tǒng)底層,應(yīng)用框架,應(yīng)用軟件都是用C\C++或OC寫(xiě)的,所有運(yùn)行效率高。
同android ,一個(gè)包名對(duì)應(yīng)一個(gè)唯一應(yīng)用;
retina 視網(wǎng)膜屏幕,只有3.5和iphone4才有;
每一個(gè)應(yīng)用程序都有屬于自己的UIWindow;(IOS采用MVC模式)
UIView:視圖。屏幕上可以看的看的東西都是UIView,如標(biāo)簽,文本,按鈕(同android中的View),都是繼承自UIView。
UIViewController(控制器) : 內(nèi)部默認(rèn)有個(gè)UIView視圖;用于控制UIView這間的切換;管理UIView的生命周期;給UIView裝配數(shù)據(jù);處理UIView的事件處理;(類(lèi)似android中的Activity)
+虛擬機(jī)+
shift+cmd+H(單次):退回桌面(home)
shift+cmd+H(兩次):最近運(yùn)行的軟件并可關(guān)閉
運(yùn)行原理:
入口 main.m中的main函數(shù);再執(zhí)行UIApplicationMain函數(shù)(先創(chuàng)建一個(gè)UIApplication實(shí)例(同android中的application,也是單例的);創(chuàng)建完成后馬上開(kāi)啟一個(gè)消息循環(huán)(main loop)(故main方法永遠(yuǎn)沒(méi)有返回),用來(lái)監(jiān)聽(tīng)用戶的操作;是應(yīng)用程序的象征;再創(chuàng)建一個(gè)UIApplication的delegate對(duì)象,負(fù)責(zé)監(jiān)聽(tīng)UIApplication的生命周期,當(dāng)UIApplication生命周期發(fā)生改變時(shí)會(huì)向UIApplicationDelegate發(fā)送不同的消息);
運(yùn)行過(guò)程:
第一次打開(kāi):didFinishLaunchingWithOptions(加載完畢)—> applicationDidBecomeActive(獲取焦點(diǎn));
當(dāng)按home鍵時(shí):applicationWillResignActive(失去焦點(diǎn))—>
applicationDidEnterBackground(進(jìn)入后臺(tái));
當(dāng)再次點(diǎn)擊應(yīng)用圖標(biāo)重新進(jìn)入應(yīng)用時(shí):applicationWillEnterForeground(進(jìn)入前臺(tái))—> applicationDidBecomeActive(獲取焦點(diǎn));
main方法中返回:
//創(chuàng)建application和代理后,再開(kāi)啟一個(gè)消息循環(huán)。
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))
參數(shù):
第3個(gè)參數(shù):指定UIApplication的類(lèi)名(或子類(lèi)),若為nil,默認(rèn)就是UIApplication;
第4個(gè)參數(shù):指定UIApplication代理的類(lèi)名;
///應(yīng)用加載完畢時(shí)調(diào)用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//初始化一個(gè)窗口,默認(rèn)下一個(gè)程序?qū)?yīng)一個(gè)程序,并加載頁(yè)面
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
//初始化一個(gè)控制器,指定xib的名字;并設(shè)置到窗口的根控制器
//相當(dāng)于[self.window addSubview:self.viewController.view]
self.window.rootViewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
//窗口默認(rèn)不會(huì)顯示,需要調(diào)用方法來(lái)顯示
//在眾多窗口,會(huì)有一個(gè)主窗口(KeyWindow),只有主窗口才能跟用戶交互
//與self.window.hidden=NO區(qū)別在于能與用戶進(jìn)行交互
[self.window makeKeyAndVisible];
return YES;
}
將事件與按鈕關(guān)聯(lián):
創(chuàng)建一個(gè)xib文件,插入文本和按鈕;
用連線的方式關(guān)聯(lián)view與viewController;
在當(dāng)前ViewController對(duì)應(yīng)的.h文件中聲明文本控件和按鈕的響應(yīng)名
//將文本控件當(dāng)作類(lèi)的成員變量,不需要自己管理內(nèi)存,由View管理內(nèi)部所有view的生命周期,故對(duì)UI控件可直接賦值,不需要retain
//用IBOutlet可顯示在xib的列表中
@property (nonatomic,assign)IBOutlet UITextField *qq;
@property (nonatomic,assign)IBOutlet UITextField *pwd;
//定義一個(gè)按鈕的方法,IBAction就是void,可關(guān)聯(lián)到顯示到xib文件右擊列表
-(IBAction)login;
在xib中將控件和定義的控件變量名(事件方法)用連線的方式關(guān)聯(lián)起來(lái);
在.m中實(shí)現(xiàn)函數(shù)即可
收起鍵盤(pán)方法:哪個(gè)控件調(diào)起,則由哪個(gè)控件收回;(為防止控件被鍵盤(pán)覆蓋,1.可修改控件的y值;2.使用scollView);
-(void)login{
NSString *qqtext = _qq.text;
NSString *pwdtext = _pwd.text;
NSLog(@"*** login ****,%@,%@",qqtext,pwdtext);
//暫時(shí)理解,調(diào)出鍵盤(pán)的那個(gè)視圖就是第一個(gè)響應(yīng)者(FirstResponder)
//1.代表不想當(dāng)?shù)谝豁憫?yīng)者,就會(huì)收起鍵盤(pán);//也可遍歷退出
[_qq resignFirstResponder];
[_pwd resignFirstResponder];
//2.若第一響應(yīng)者存在于self.view里面(包括所有子孫節(jié)點(diǎn)控件),就可以退出鍵盤(pán);
[self.view endEditing:YES];
}
— weak —:(類(lèi)似于java中弱引用)相當(dāng)于老版本的assign,指針變量仍然可以指向一個(gè)對(duì)象,但不屬于對(duì)象的擁有者,一般ViewController對(duì)UI控件都是弱引用,View消失,則其中所有控件消失,不會(huì)引起野指針錯(cuò)誤;仍然可以指向一個(gè)對(duì)象,但不屬于對(duì)象的擁有者。即當(dāng)對(duì)象被銷(xiāo)毀的時(shí)候,這個(gè)weak指針也就自動(dòng)指向nil(空指針)。
— strong —:(類(lèi)似于java中強(qiáng)引用)相當(dāng)于retain,具有持對(duì)象的能力;能夠保持對(duì)象的生命,一個(gè)對(duì)象只要有strong指針指向它,那么它就不會(huì)被釋放;相反的,如果一個(gè)沒(méi)有一個(gè)strong指針指向它,那么它將會(huì)被自動(dòng)釋放。默認(rèn)所有實(shí)例變量和局部變量都是Stong指針
保留連環(huán)(retain cycle):兩個(gè)或更多對(duì)象以一種連環(huán)的方式相互拖持有,和個(gè)對(duì)象且個(gè)值為1或更大值的引用計(jì)數(shù),因此它們的的指針永遠(yuǎn)不會(huì)釋放,所有保留連環(huán)中的對(duì)象也從不會(huì)被銷(xiāo)毀。為避免這種情況,在創(chuàng)建的時(shí)候須考慮好是誰(shuí)創(chuàng)建誰(shuí),并一定使用weak關(guān)鍵字。即可使用所有者對(duì)象持有另一個(gè)對(duì)象,但另一個(gè)對(duì)象絕不會(huì)持有它的所有者。
從IOS5.0開(kāi)始,使用storyboard來(lái)描述界面(但實(shí)際開(kāi)發(fā)時(shí)多人開(kāi)發(fā)容易沖突,使用xib可為單個(gè)viewController創(chuàng)建)
設(shè)置啟動(dòng)的主界面(main storyboard): 項(xiàng)目targets —> Deployment info—> Main Interface;
啟動(dòng)過(guò)程:
加載最主要的storyboard文件—>創(chuàng)建viewController —>創(chuàng)建控制器內(nèi)部的View,并顯示。
UIViewController與UIView的關(guān)系:UIViewController內(nèi)部都有個(gè)UIView對(duì)象,就是管理的view;
新版本SDK開(kāi)的新功能不一定能在低版本的ios版本上實(shí)現(xiàn)(同android);
++ UIView ++控件外部的(0,0)是控件父控件的左上角。直接在storyboard,直接拖動(dòng),在列表中的控件越靠后越在上。
常用屬性:
- frame - 位置和尺寸(以父控件的左上角為原點(diǎn)(0,0)),寬高位置都能更改
- center- 中點(diǎn) (以父控件的左上角為原點(diǎn)(0,0))也可用于改變位置
- bounds- 位置和尺寸(以自己的左上角為原點(diǎn) (0,0)),只能改寬高,不能改位置
- transform - 形變屬性(縮放,旋轉(zhuǎn))
- backgroundColor - 背景顏色
- tag - 標(biāo)識(shí)
-tag-:在view下,設(shè)置控件的tag(類(lèi)似于android的id),若多個(gè)按鈕點(diǎn)擊同一個(gè)方法,則可區(qū)別是哪個(gè)控件點(diǎn)擊的。 - hidden - 設(shè)置是否要隱藏
- alpha - 透明度(0~1);
- opaque - 不透明度(0~1);
- userInteractionEnabled - 能否跟用戶進(jìn)行交互(YES 能交互)
- superView - 父控件
- subviews - 子控件
- contentMode - 內(nèi)容顯示的模式 拉伸自適應(yīng)
[不能直接修改對(duì)象內(nèi)部的結(jié)構(gòu)體的屬性值]
++ 設(shè)置代碼模塊 ++
左鍵長(zhǎng)按代碼塊 到TextSetting的花括號(hào)中,并設(shè)置其名稱(chēng)和快捷鍵(不是設(shè)置鍵盤(pán)上的按鍵,是直接先快捷代碼命令,如btn-set)
- UIButton 與UIImageView的區(qū)別:
UIButton有background屬性,而UIImageView只有image屬性。
[雷同于android中的ImageView和Button]
[Button有同android中TextView左右添加圖片的屬性]
UIImageView 繼承自UIView就不能監(jiān)聽(tīng)操作事件;
— 所有控件,只要繼承UIControl都能監(jiān)聽(tīng)屏幕操作事件;通過(guò)addTarget:<#(nullable id)#> action:<#(nonnull SEL)#> forControlEvents:<#(UIControlEvents)#>可添加事件監(jiān)聽(tīng);
若不用tag進(jìn)行標(biāo)識(shí)點(diǎn)擊的是哪個(gè)按鈕,可用字典文本的方式:新建一個(gè)字典plist,添加按鈕文本和int型的value;將按鈕上的文字設(shè)置成對(duì)應(yīng)的字典中的key并設(shè)置其顏色為clear color;在點(diǎn)擊事件中用按鈕上的文字從字典中取出value再添加操作方法。
[區(qū)域點(diǎn)擊可考慮使用透明按鈕]
— 兩種方式加載圖片:
[使用Product—Profile—Allocations 來(lái)進(jìn)行內(nèi)存使用監(jiān)控]
[UIImage imageNamed@“”]該方法是系統(tǒng)方法(有緩存),加載圖片后不會(huì)自動(dòng)釋放內(nèi)在。圖片先加載到內(nèi)存中,使用后再放入緩存中,若沒(méi)有釋放,加載大量圖片則會(huì)使內(nèi)存撐爆。
[[UIImage alloc] initWithContentsOfFile:<#(nonnull NSString *)#>]無(wú)緩存,使用完成后會(huì)自動(dòng)釋放(但不是馬上釋放,會(huì)找個(gè)合適的時(shí)候釋放),減小內(nèi)存消耗;[使用該方法]