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

首頁 > 學院 > 開發(fā)設計 > 正文

Objective-C基礎核心語法-總結

2019-11-14 18:38:21
字體:
來源:轉載
供稿:網友

一、點語法本質

  • 點語法”本質是“方法調用”
  • 當使用“點語法”時,編譯器會自動展開稱相應的方法
  • id類型的對象不能用 點語法
1 //方法調用2 Student *stu = [[Student alloc] init]; 3 [stu setAge:10]; 4 int age = [stu age];5 //-----------------------------我是華麗分割線-----------------------------6 //點語法 7 stu.age = 10; 8 int age = stu.age;

  

 


二、成員變量的作用域

  • @public : 在任何地方都能直接訪問對象的成員變量
  • @PRivate : 只能在當前類的對象方法中直接訪問 ( @implementation 中默認是 @private )
  • @protected  : 可以在當前類及其字累的對象方法中直接訪問 (默認就是 @protected 
  • @package : 只要處在同一個框架中,就能直接訪問對象的成員變量
  • @interface@implementation 中不能聲明同名的成員變量
  • 沒有 @interface ,只有 @implementation ,也可以開發(fā)同一個類

 


三、@property 和 @synthesize setter 和 getter 及使用細節(jié)

  • @property 用在 @interface 中,用來自動生成 setter 和 getter 聲明
  • @synthesize 永在 @implementation 中,用來生成 setter 和 getter 實現
  • @synthesize 細節(jié):1> @synthesize age = _age;(setter 和 getter 實現中會訪問成員變量 _age,如果成員變量 _age 不存在,就會自動生成一個 @private 的成員變量 _age 
    •       2> @synthesize age;(setter 和 getter 實現中會訪問成員變量 age,如果成員變量 age 不存在,就會自動生成一個 @private 的成員變量 age
    •       3> 若手動實現了 setter 方法,編譯器就只會自動生成 getter 方法
  • 自從 Xcode4.4 后,@property 就獨攬了 @synthesize 的功能。也就是說,@property 可以同時生成 settergetter聲明實現
  • 默認情況下,setter 和 getter 方法中的實現,會訪問下劃線 _ 開頭的成員變量
 1 //--[interface.h]---Xcode4.2之前的語法---------------我是華麗分割線-------- 2 @property int age;                         //@property 3 //--[interface.h]--------??等價于??-------- 4 - (void)setAge; 5 - (int)age;  6  7 //--[implementation.m]-------------------------------我是華麗分割線-------- 8 @synthesize int age = _age;                //@synthesize 9 //--[implementation.m]---??等價于??--------10 - (void)setAge {11     _age = age;12 }13 - (int)age {14     return _age;15 }16 //--[implementation.m]-------------------------------我是華麗分割線--------17 @synthesize int age;                        //@synthesize18 //--[implementation.m]---??等價于??--------19 - (void)setAge {20     _age = age;21 }22 - (int)age {23     return age;24 }25 26 //--[interface.h]---Xcode4.4之后有了以下新語法-------我是華麗分割線-------27 @property int age;                           //@property28 //--[interface.h]---------??等價于??-------29 @interface Student:NSObject{30     int _age;31 }32 - (void)setAge;33 - (int)age; 34 //--[implementation.m]---------------------35 - (void)setAge {36     _age = age;37 }38 - (int)age {39     return _age;40 }                 

 


四、id

  • 是萬能指針,能指向任何對象,相當于 NSObject * , id 后面不要加上
  • 調用一個不存在的方法,編譯器會馬上報錯
  • id 是一個結構體,OC 對象本身是一個結構體
1 typedef struct objc_object {2   Class isa;    //每個對象都有一個isa,且isa始終指向當前類本身3 } *id;            // id 定義為一個結構指針

 


五、構造方法(基本概念、重寫 init 方法、init 方法的執(zhí)行過程、自定義)

  • 完整地創(chuàng)建一個可用的對象:1> 分配存儲空間 alloc,2> 初始化 - init (+ new 方法連續(xù)完成 1>、2> 步驟)
  • 基本概念:用來初始化對象的方法,是一個對象方法, 號開頭,init 方法就是構造方法
  • 重寫 init 方法:一定要調用回 super 的 init 方法。重寫目的:為了讓對象創(chuàng)建出來,就使成員變量具有固定的值
  • 1 //----Student.m-------------
  • 2 - (id)init {
  • 3 if (self = [super init]) //調用回super的init方法,返回對象self,即isa為Student對象
  • 4 { //初始化成功
  • 5 _age = 10;
  • 6 }
  • 7 return self;
  • 8
1 //------NSObject------------2 - (id)init {3     isa = [self class];4     return slef;5 }
  • init 方法的執(zhí)行過程:先初始化父類,再初始化子類。
  • 自定義:規(guī)范:1>一定是對象方法,一定以 - 開頭,2>返回值一般為 id 類型,3>方法名一般以 init 開頭
  • 初始化的好習慣:初始化成員變量在其所在類實現中進行(優(yōu)點:去耦合。即當父類改變成員變量名稱,就不用改子類的代碼)

 


六、更改 Xcode 模版(main.m 、注釋)

  • main.m:如 Mac application的終端項目:進入/Users/jackieyi/Library/Developer/Xcode/Templates/Project Templates/Application/Command Line Tool.xctemplate/Templateinfo.plist,按需要修改這個plist文件即可。
  • 注釋:如 Mac Application的終端項目:進入/Users/JackieYip/Library/Deverloper/Xcode/Templates/File Templates/Cocoa/Objective-C class.xctemplate/NSObject/___FILEBASENAME___.m,或按需要選對應文件進行修改即可。

 


七、分類(基本使用、使用注意、給 NSString 增加類方法及擴充對象方法)

  • 作用:在不改變原來類內容的基礎上,可以為類增加一些方法
  • 注意:1> 只能增加方法,無法增加成員變量,但在分類的方法中可以訪問原類的成員變量
    • 2> 分類可以重新實現原來類中的方法,但是會覆蓋原來的方法,會導致原來的方法無法再使用
    • 3> 方法調用的優(yōu)先級:高|分類(最后參與編譯的分類優(yōu)先)->原類->父類|低
      • 編譯順序的查看:項目-TARGETS - Builde Phases - Complie Sources,由上往下順序編譯(全為 .m 文件,.h 文件不參與編譯)

 


八、類的深入研究(本質、類對象的使用、類的加載和初始化)

  • 本質:我們知道:每個對象都有類型。而類本身也是一個對象,簡稱“類對象”,“類對象”的類型為 Class 類型(Class包含*)。
    • 由“類對象”創(chuàng)建的對象稱為“實例對象”。
    • “類對象”默認只有一份被加載到內存中,“實例對象”可以有多份被加載到內存中(不同的“實例對象”,其isa始終指向其同一“類對象”)。
1 Student *stu = [[Student alloc] init];2 Class stu1 = [stu class];                //利用Class創(chuàng)建Student類對象,[stu class]是獲取內存中的類對象3 Class stu2 = [Student class];        //stu1的地址等于stu2的地址,都是stu的地址
  • 使用:“類對象”可以調用“類方法”
  • 加載:屬于運行時機制。當程序啟動的時候,就會加載一次項目中所有的類和分類(無論有無使用類)。類加載完畢之后就會調用 + load 方法,只調用一次(先加載 父類 ,再加載 子類,最后加載 分類 )
1 + (void)load {2      //程序一啟動,所有的類都調用這個加載方法3 }        
  • 初始化:屬于運行時機制。當第一次使用類的時候,就會調用一次 + initialize 方法(先初始化 父類 ,再初始化 子類 ,如果有 分類 ,只會初始化 分類 ) 
1 + (void)initialize {2      //第一次使用類的時候([[類 alloc]init]),就會調用一次這個方法。我們可以在這里監(jiān)聽類何時被使用3 }

 


九、description 方法

  • 默認情況下,利用 NSLog 和 %@ 輸出 類對象 的時候,結果是:<類名:內存地址>
  • 每次調用 NSLog (@"%@",“實例對象”) 的時候,會默認調用“實例對象”的 - description 方法, - description  方法的返回值為 (NSString *),默認返回的是"類名+內存地址"
  • 可以重寫 - description 方法輸出所有 成員變量
1 - (NSSting *)description {2         //  NSLog(@"%@",self);        //這行代碼會引發(fā)死循環(huán)3         return [NSString stringWithFormat:@"age=%d, name=%@", _age, _name];4 }
  • 每次調用 NSLog (@"%@",“類對象”) 的時候,會默認調用“類對象”的 + description 方法,+ description  方法的返回值為 (NSString *),默認返回的是"類名"
  • + description 也可以被重寫

 


十、NSLog 輸出補充

1 int main() {2     NSLog(@"%d",__LINE__);        //輸出當前行號(即 2 )3     //NSLog(@"%s",__FILE__);        //NSLog輸出 C 語言字符串的時候,不能有中文4     printf(@"%s/n",__FILE__);        //輸出源文件的名稱(含路徑)5     NSLog(@"%s/n",__func__);        //輸出當前函數名(即 main )6 }

 


十一、SEL (基本用法及其他使用)

  • 屬于運行時機制。一個 SEL 代表一個方法,對應方法地址
  • 對象調用 方法 時:1> 先把 方法 包裝成 SEL 類型的數據,2> 根據 SEL 數據找到對應的 方法地址,3> 根據 方法地址 調用對應的方法
1 int main() {2     Student *stu = [[Student alloc] init];3     [stu test]; 4     [stu performSelector:@selector(test)];        //間接調用test方法,@selector(test)就是一個SEL類型5     [stu performSelector:@selector(test1:) withObject:@"123"]; //間接調用test:方法,@selector(test:)就是一個SEL類型6
1 NSString *name = @"test";2 SEL s = NSSelectorFromSrting(name)        //將test方法包裝成SEL數據3 [stu performSelector:s];
  • 每個方法里面都有一個 SEL 類型數據的_cmd_cmd代表當前方法。給對象傳遞消息,其實就是給對象傳遞 SEL 數據。SEL 不能直接打印,只能轉成字符串進行打印。
1 - (void)test {2     NSString *str = NSStingWithSelector(_cmd);3     NSLog(@"調用了test方法---%@",str);        //顯示:調用了test方法---test4 }

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 江津市| 贡山| 星子县| 桃源县| 江阴市| 莱阳市| 合山市| 德昌县| 子洲县| 秀山| 巴彦县| 安龙县| 抚州市| 伊宁市| 德昌县| 万荣县| 青龙| 台北市| 罗山县| 长治县| 惠来县| 弥勒县| 历史| 明光市| 什邡市| 新和县| 营口市| 承德市| 德惠市| 乌拉特前旗| 怀仁县| 新乐市| 大连市| 吐鲁番市| 临安市| 桃园市| 白山市| 竹山县| 阿瓦提县| 嘉荫县| 辽阳县|