IOS開發學習筆記(一)

概述:
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是沒有虛擬機);系統底層,應用框架,應用軟件都是用C\C++或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 *)#>]無緩存,使用完成後會自動釋放(但不是馬上釋放,會找個合適的時候釋放),減小內存消耗;[使用該方法]

博客地址:IOS開發學習筆記(一)

發佈了46 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章