黑馬程序員----Objective-C學習筆記之類的本質與SEL類型

------Java培訓、Android培訓、iOS培訓、.Net培訓--------

一、類的本質

1、類的本質

類的本質其實也是一個對象(類對象),是Class類型

 

【類對象】

1)類對象在程序運行時一直存在

2)類對象是一種數據結構,存儲類的基本信息:類大小,類名稱,類的版本信息,以及消息和函數的映射表等

 

2、類對象如何獲取

 

1)通過實例對象獲取

 

例如:

        Animal *ani = [Dog new];
        Animal *ani2 = [Dog new];
        Class ac = [ani class];
        Class ac2 = [ani2 class];
        
        NSLog(@"ac = %p", ac);
        NSLog(@"ac2 = %p", ac2);
        NSLog(@"Dog = %p", [Dog class]);

打印結果:

2015-10-04 22:38:57.712VariableClass[2302:303] ac = 0x100001330

2015-10-04 22:38:57.714VariableClass[2302:303] ac2 = 0x100001330

2015-10-04 22:38:57.716VariableClass[2302:303] ac2 = 0x100001330

 

2)通過類名獲取

1)中 NSLog(@"Dog = %p", [Dog class]);

 

 

3、類對象的使用

例如:

      

  Animal *ani = [Dog new];
        Class ac = [ani class];
       
        Dog *dog = [ac new];
        [dog bark];

打印結果:

2015-10-04 22:43:38.948 VariableClass[2355:303] Wangwang...

分析結果:

可知類對象ac可以當Dog類用,可以創建Dog實例對象


二、SEL類型

SEL:全程selector表示方法的存儲位置

 

尋找方法的過程:

1)先把方法封裝成一個SEL類型的數據

2)根據SEL數據找到對應的方法地址

3)根據方法地址調用相應的方法

4)【注意】在這個操作過程中有緩存,第一次找得時候是一個一個的找,非常消耗性能,之後再用到的時候就直接使用。

 

【注意】SEL其實是對方法的一種包裝,將方法包裝秤一個SEL類型的數據,去尋找對應的方法地址,找到方法地址就可以調用方法,這些都是運行時的特性,發消息就是發送SEL,然後根據SEL找到地址,調用方法。

例如:

        Dog *dog = [Dog new];
        [dog bark];
        SEL sel = @selector(bark);
        [dog performSelector:sel];


 

打印結果:

2015-10-04 23:02:58.856 VariableClass[2437:303] Wangwang...

2015-10-04 23:02:58.859 VariableClass[2437:303] Wangwang...


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