国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

OC筆記(2)

2019-11-09 15:56:44
字體:
來源:轉載
供稿:網友

1.@class @PRoperty (retain) Book *book 假設有兩個類,一個是 Card,一個是 Person,當 Card 中包含 Person,我們就需要在 Card 前加上#import “Person.h“。 如果此時 Person 中再包含 Card 的話,我們就又得在 Person 類前加上#import “Card.h”。這時再編譯運行就會 出現故障,因為編譯運行會導致兩個類不停得拷貝對方,導致報錯。 這時可以在兩個類前用:@class 類 就可以避免這種問題,比如在 Person 中用@class Card;代替#import “Card.h”。在 Card 中用@class Person;代替 import “Person.h”。但是這樣還是有一個問題,它僅僅告訴編譯器某個名稱是一個類,并沒有把這個類中的 所有東西拷貝過來。在實際開發中: (1) 在.h 文件中用@class 來聲明類 (2) 在.m 文件中用#import 來包含類的所有東西 –@class 和#import 的區別(高頻面試題): 對于循環依賴關系來說,比如 A 類引用 B 類,同時 B 類也引用 A 類: 這種代碼會報錯,當時用@class 在兩個類中互相聲明,就不會編譯報錯。 (1)#import 方式會包含被引用類的所有信息,包括被引用類的變量和方法;@class 方式只是告訴編譯器在 A.h 文件中 B *b 只是類的聲明,具體這個類有什么信息,這里不需要知道,等實現文件中真正要用到時,才會去 查看 B 類中信息。 (2)如果有上百個頭文件都#import 了同一個文件,或者這些文件依次被#import,那么一旦最開始的頭文件稍 有改動,后面引用這個文件的所有類都要重新編譯一遍,這樣對效率的影響也是可想而知的。相對來講,使 用@class 方式就不會出現這種問題了。 (3)在.m 實現文件中,如果需要引用到被引用類的尸體變量或者方法時,還需要使用#import 方式引用被引用 類。

2.循環引用 循環 retain 問題(循環引用問題 1,非 ARC 下發生): 一端用 retain,一端用 assign 循環 strong 問題(循環引用問題 2,ARC 下發生) :一端用 strong,另一端用 weak

3.block代碼塊 Block 和方法很像,Block 特點: (1)可以保存代碼 (2)可以有返回值 (3)可以有形參 (4)調用方式和調用方法一樣 (5)可以像方法一樣調用外面的變量 (6)默認條件下,Block 不能修改外面的局部變量,但是在變量名前加上_block 就可以使 Block 可以修改這 個變量。比如: _block int b = 20; 但是 Block 可以修改全局變量。 (7)實際開發中,常用 typedef 定義 Block 以減少代碼量,比如: typedef int (*MyBlock)(int, int); 以后再定義 Block 就可以: MyBlock sumBlock = ^(int a,intb){ return a + b; } 【備注】當 block 用到外面的東西時候,要把用的的外面的那個東西聲明為弱指針,否則會發生循環引用的 問題。聲明方法: _weak ViewController *vc = self;//可以避免野指針,推薦使用 或者: _unsafe_unretained ViewController *vc = self; 以后在代碼塊里調用的 vc 就以弱指針的方式調用。

4.通過代碼創建一個控件 關于控件的繼承關系(面試重點): (1)所有的控件都繼承自 UIView。 (2)能監聽事件的都是先繼承自 UIControl,UIControl 再繼承自 UIView。比如 UIButton。 (3)能整體滑動的都是繼承自 UIScrollView,UIScrollView 再繼承自 UIView。比如 UITableView。 (4)UIWindow 也是繼承自 UIView。 首先,創建控件的代碼要寫在 - (void)viewDidLoad{ }; 中,這個方法是在 view 被創建完畢后執行的方法。

5.transform transform 是一個狀態,并不能改變控件的真實位置(以起始位置為參照,起始位置為(0,0),即真實位置為 (0,0)),如果使用 CGAffineTransformMakeTranslation(0, -100)就會返回控件在真實位置上向上移動 100 像 素后的狀態,但真實位置不會改變,當第二次執行 head.transform = CGAffineTransformMakeTranslation (0, -100) 就不會再有變化了,因為控件已經在這個狀態了。

6.Plist文件 在創建 Plist 文件的時候要特別注意名稱當中不能帶“info”,如果帶了“info”會導致 xcode 把它誤當作一個項 目中某個文件而出現問題。,導致文件加載不進來。

7.UIImage的加載 1、UIImage 的 2 種加載圖片方式 (1)有緩存(圖片所占用的內存會一直停留在程序中),可能會導致占用大量內存而使程序崩潰,加載少量 小圖片時候使用。 + (UIImage )imageNamed:(NSString )name; name 是圖片的文件名,png 圖片不用加后綴名,jpg 等其他圖片格式要加后綴名。 (2)無緩存(圖片所占用的內存會在一些特定操作后被清除),在加載大量圖片時候使用 + (UIImage )imageWithContentsOfFile:(NSString )path - (id)initWithContentsOfFile:(NSString *)path; path 是圖片的全路徑 例如: NSBundle *bundle = [NSBundle mainBundle]; NSString *path = [bundle pathForResource:filename ofType:nil]; UIImage *image = [UIImage imageWithContentsOfFile:path];

8.UIapplication UIApplication 對象是應用程序的象征。每一個應用都有自己的 UIApplication 對象,而且是單例(只能有一個對 象,我們不能去創建新對象,只能獲取這個對象)的。通過[UIApplication sharedApplication]可以獲得這個單例 對象。 一個 iOS 程序啟動后創建的第一個對象就是 UIApplication 對象。利用 UIApplication 對象,能進行一些 應用級別的操作。 UIApplication 有個功能十分強大的 openURL:方法 - (BOOL)openURL:(NSURL*)url; openURL:方法的部分功能: (1)打電話 UIApplication *app = [UIApplication sharedApplication]; [app openURL:[NSURL URLWithString:@”tel://10086”]]; (2)發短信 [app openURL:[NSURL URLWithString:@”sms://10086”]]; (3)發郵件 [app openURL:[NSURL URLWithString:@”mailto://12345@QQ.com”]]; (4)打開一個網頁資源(自動跳轉到瀏覽器打開)[app openURL:[NSURL URLWithString:@”http://ios.123.cn“]]; (5)打開其他 app 程序 …….

9.UIWindow UIWindow 是一種特殊的 UIView,通常在一個 app 中只會有一個 UIWindow。 iOS 程序啟動完畢后,創建的第一個視圖控件就是 UIWindow,接著創建控制器的 view,最后將控制器的 view 添加到 UIWindow 上,于是控制器的 view 就顯示在屏幕上了。

10.響應者對象 在 iOS 中不是任何對象都能處理事件,只有繼承了 UIResponder 的對象才能接收并處理事件。我們稱之為“響 應者對象”, UIApplication、UIViewController、UIView 都繼承自 UIResponder,因此它們都是響應者對象,都能夠接收并處 理事件。

如果父控件不能接收觸摸事件,那么子控件就不可能接收到觸摸事件(掌握)。

UIView 不接收觸摸事件的三種情況: (1)不接收用戶交互 userInteractionEnabled = NO (2)隱藏 hidden = YES (3)透明 alpha = 0.0 ~ 0.01 【備注】UIImageView 的 userInteractionEnabled 默認就是 NO,因此 UIImageView 以及它的子控件默認是不能接收觸摸事件的。

11. 響應者鏈的事件傳遞過程 (1)如果 view 的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父視圖。 (2)在視圖層次結構的最頂級視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給 window 對象進行處理。 (3)如果 window 對象也不處理,則其將事件或消息傳遞給 UIApplication 對象。 (4)如果 UIApplication 也不能處理該事件或消息,則將其丟棄。

12、觸摸事件完整處理過程 1、先將事件對象由上往下傳遞(由父控件傳遞給子控件),找到最合適的控件來處理事件。 2、調用最合適控件的 touches…方法。 3、如果這個控件調用了[super touches…];就會將事件順著相應鏈條往下傳遞,傳遞給下一個響應者。 4、接著就會調用下一個響應者的 touches…方法。 5、事件還可以繼續往下傳遞,直到 UIApplication,如果 UIApplication 也不處理該事件或消息,則將其丟棄。 【備注】關于上面的下一個響應者: (1) 如果當前這個 View 是控制器的 View,那么控制器就是下一個響應者。 (2) 如果當前這個 View 不是控制器的 View,那么父控件就是下一個響應者。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彩票| 宁化县| 阿克苏市| 宜春市| 大新县| 耒阳市| 吉安县| 江华| 荆门市| 敦煌市| 普安县| 湘乡市| 措美县| 信丰县| 保山市| 江都市| 崇文区| 益阳市| 泾川县| 凯里市| 易门县| 云林县| 尼勒克县| 汕头市| 济源市| 蒙山县| 台州市| 酒泉市| 崇义县| 陇川县| 德保县| 南开区| 定兴县| 青河县| 枣强县| 麻江县| 塔河县| 天峨县| 镇坪县| 河间市| 固镇县|