概述: 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開發學習筆記(一)
新聞熱點
疑難解答