一、類的本質
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...