概述:

iOS是蘋果開發的手持設備操作系統(iPhone,iPad,iPod touch,iPad mini)。

基於UNIX,層次架構:核心操作系統層(Core OS)—> 核心服務層(Core Services)—>媒體層(Media)—>可觸摸層(Cocoa Touch);

主要面對Cocoa Touch層;很多技術都是基於OC,底層很多框架是C開發的;Cocoa Touch層中的UIKit框架,為應用提供了各種可視化的組件如,窗口(UIWindow),視圖(UIView)和按鈕(UIButton);還提供了其他有用的框架,如拍照,照片,感測器,陀螺儀等硬體支持框架。

iOS 可直接與底層硬體通信(區別與android是沒有虛擬機);系統底層,應用框架,應用軟體都是用CC++或OC寫的,所有運行效率高。

同android ,一個包名對應一個唯一應用;

retina 視網膜屏幕,只有3.5和iphone4纔有;

每一個應用程序都有屬於自己的UIWindow;(IOS採用MVC模式)

UIView:視圖。屏幕上可以看的看的東西都是UIView,如標籤,文本,按鈕(同android中的View),都是繼承自UIView。

UIViewController(控制器) : 內部默認有個UIView視圖;用於控制UIView這間的切換;管理UIView的生命週期;給UIView裝配數據;處理UIView的事件處理;(類似android中的Activity)

++ 虛擬機 ++

shift+cmd+H(單次):退回桌面(home)

shift+cmd+H(兩次):最近運行的軟體並可關閉

運行原理:

入口 main.m中的main函數;再執行UIApplicationMain函數(先創建一個UIApplication實例(同android中的application,也是單例的);創建完成後馬上開啟一個消息循環(main loop)(故main方法永遠沒有返回),用來監聽用戶的操作;是應用程序的象徵;再創建一個UIApplication的delegate對象,負責監聽UIApplication的生命週期,當UIApplication生命週期發生改變時會向UIApplicationDelegate發送不同的消息);

運行過程:

第一次打開:didFinishLaunchingWithOptions(載入完畢)—> applicationDidBecomeActive(獲取焦點);

當按home鍵時:applicationWillResignActive(失去焦點)—>

applicationDidEnterBackground(進入後臺);

當再次點擊應用圖標重新進入應用時:applicationWillEnterForeground(進入前臺)—> applicationDidBecomeActive(獲取焦點);

main方法中返回:

//創建application和代理後,再開啟一個消息循環。

UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))

參數:

第3個參數:指定UIApplication的類名(或子類),若為nil,默認就是UIApplication;

第4個參數:指定UIApplication代理的類名;

///應用載入完畢時調用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//初始化一個窗口,默認下一個程序對應一個程序,並載入頁面

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

//初始化一個控制器,指定xib的名字;並設置到窗口的根控制器

//相當於[self.window addSubview:self.viewController.view]

self.window.rootViewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

//窗口默認不會顯示,需要調用方法來顯示

//在眾多窗口,會有一個主窗口(KeyWindow),只有主窗口才能跟用戶交互

//與self.window.hidden=NO區別在於能與用戶進行交互

[self.window makeKeyAndVisible];

return YES;

}

將事件與按鈕關聯:

創建一個xib文件,插入文本和按鈕;

用連線的方式關聯view與viewController;

在當前ViewController對應的.h文件中聲明文本控制項和按鈕的響應名

//將文本控制項當作類的成員變數,不需要自己管理內存,由View管理內部所有view的生命週期,故對UI控制項可直接賦值,不需要retain

//用IBOutlet可顯示在xib的列表中

@property (nonatomic,assign)IBOutlet UITextField *qq;

@property (nonatomic,assign)IBOutlet UITextField *pwd;

//定義一個按鈕的方法,IBAction就是void,可關聯到顯示到xib文件右擊列表

-(IBAction)login;

在xib中將控制項和定義的控制項變數名(事件方法)用連線的方式關聯起來;

在.m中實現函數即可

收起鍵盤方法:哪個控制項調起,則由哪個控制項收回;(為防止控制項被鍵盤覆蓋,1.可修改控制項的y值;2.使用scollView);

-(void)login{

NSString *qqtext = _qq.text;

NSString *pwdtext = _pwd.text;

NSLog(@"*** login ****,%@,%@",qqtext,pwdtext);

//暫時理解,調出鍵盤的那個視圖就是第一個響應者(FirstResponder)

//1.代表不想當第一響應者,就會收起鍵盤;//也可遍歷退出

[_qq resignFirstResponder];

[_pwd resignFirstResponder];

//2.若第一響應者存在於self.view裡面(包括所有子孫節點控制項),就可以退出鍵盤;

[self.view endEditing:YES];

}

— weak —:(類似於java中弱引用)相當於老版本的assign,指針變數仍然可以指向一個對象,但不屬於對象的擁有者,一般ViewController對UI控制項都是弱引用,View消失,則其中所有控制項消失,不會引起野指針錯誤;仍然可以指向一個對象,但不屬於對象的擁有者。即當對象被銷毀的時候,這個weak指針也就自動指向nil(空指針)。

— strong —:(類似於java中強引用)相當於retain,具有持對象的能力;能夠保持對象的生命,一個對象只要有strong指針指向它,那麼它就不會被釋放;相反的,如果一個沒有一個strong指針指向它,那麼它將會被自動釋放。默認所有實例變數和局部變數都是Stong指針

*保留連環(retain cycle)*:兩個或更多對象以一種連環的方式相互拖持有,和個對象且個值為1或更大值的引用計數,因此它們的的指針永遠不會釋放,所有保留連環中的對象也從不會被銷毀。為避免這種情況,在創建的時候須考慮好是誰創建誰,並一定使用weak關鍵字。即可使用所有者對象持有另一個對象,但另一個對象絕不會持有它的所有者。

從IOS5.0開始,使用storyboard來描述界面(但實際開發時多人開發容易衝突,使用xib可為單個viewController創建)

設置啟動的主界面(main storyboard): 項目targets —> Deployment info—> Main Interface;

啟動過程:

載入最主要的storyboard文件—>創建viewController —>創建控制器內部的View,並顯示。

UIViewController與UIView的關係:UIViewController內部都有個UIView對象,就是管理的view;

新版本SDK開的新功能不一定能在低版本的ios版本上實現(同android);

++ UIView ++控制項外部的(0,0)是控制項父控制項的左上角。直接在storyboard,直接拖動,在列表中的控制項越靠後越在上。

常用屬性:

- frame - 位置和尺寸(以父控制項的左上角為原點(0,0)),寬高位置都能更改

- center- 中點 (以父控制項的左上角為原點(0,0))也可用於改變位置

- bounds- 位置和尺寸(以自己的左上角為原點 (0,0)),只能改寬高,不能改位置

- transform - 形變屬性(縮放,旋轉)

- backgroundColor - 背景顏色

- tag - 標識

-tag-:在view下,設置控制項的tag(類似於android的id),若多個按鈕點擊同一個方法,則可區別是哪個控制項點擊的。

- hidden - 設置是否要隱藏

- alpha - 透明度(0~1);

- opaque - 不透明度(0~1);

- userInteractionEnabled - 能否跟用戶進行交互(YES 能交互)

- superView - 父控制項

- subviews - 子控制項

- contentMode - 內容顯示的模式 拉伸自適應

[不能直接修改對象內部的結構體的屬性值]

++ 設置代碼模塊 ++

左鍵長按代碼塊 到TextSetting的花括弧中,並設置其名稱和快捷鍵(不是設置鍵盤上的按鍵,是直接先快捷代碼命令,如btn-set)

- UIButton 與UIImageView的區別:

UIButton有background屬性,而UIImageView只有image屬性。

[雷同於android中的ImageView和Button]

[Button有同android中TextView左右添加圖片的屬性]

UIImageView 繼承自UIView就不能監聽操作事件;

— 所有控制項,只要繼承UIControl都能監聽屏幕操作事件;通過addTarget:<#(nullable id)#> action:<#(nonnull SEL)#> forControlEvents:<#(UIControlEvents)#>可添加事件監聽;

若不用tag進行標識點擊的是哪個按鈕,可用字典文本的方式:新建一個字典plist,添加按鈕文本和int型的value;將按鈕上的文字設置成對應的字典中的key並設置其顏色為clear color;在點擊事件中用按鈕上的文字從字典中取出value再添加操作方法。

[*區域點擊可考慮使用透明按鈕]

— 兩種方式載入圖片:

[使用Product—Profile—Allocations 來進行內存使用監控]

[UIImage imageNamed@「」]該方法是系統方法(有緩存),載入圖片後不會自動釋放內在。圖片先載入到內存中,使用後再放入緩存中,若沒有釋放,載入大量圖片則會使內存撐爆。

[[UIImage alloc] initWithContentsOfFile:<#(nonnull NSString *)#>]無緩存,使用完成後會自動釋放(但不是馬上釋放,會找個合適的時候釋放),減小內存消耗;[使用該方法]


推薦閱讀:
相關文章