OC中類對象,主要分為一下三種:
(1).instance對象(實例對象)
(2).class對象 (類對象)
(3).meta-class對象(元類對象)
一、instance對象(實例對象)
instance對象是通過類alloc init
出來的對象,每次alloc init
都會產生新的instance對象。
Person *person1 = [[Person alloc]init];
Person *person2 = [[Person alloc]init];
比如:person1和person2是兩個不同的對象,分別占據著不同的內存空間。
instance在內存中存儲的內存信息包括:
1.isa指針
2.其它成員變量
.......
二、class對象 (類對象)
通過以下方法可以獲得類對象,每個類在內存中有且只有一個class對象。
class對象在內存中存儲的信息主要包括:
1.isa指針
2.superclass指針
3.類的屬性信息,類的對象方法信息等
.......Class personClass1 = [person1 class]; Class personClass2 = [Person class]; Class personCalss3 = object_getClass(person1); NSLog(@"---personClass1:%p",personClass1); NSLog(@"---personCalss2:%p",personClass2); NSLog(@"---personCalss3:%p",personCalss3);
輸出結果如下:
2020-01-04 14:21:07.039798+0800 ClassDemo[7590:109290] ---personClass1:0x10c03c588 2020-01-04 14:21:07.039966+0800 ClassDemo[7590:109290] ---personCalss2:0x10c03c588 2020-01-04 14:21:07.040110+0800 ClassDemo[7590:109290] ---personCalss3:0x10c03c588
三、meta-class對象(元類對象)
每個類在內存中只要一個meta-calss類。
meta-class在內存中存儲的主要信息:
1.isa指針
2.superclass指針
3.類的類方法信息
......
例:Person *person1 = [[Person alloc]init]; Class personClass1 = [person1 class]; // 元類對象 Class metaClass = object_getClass(personClass1); NSLog(@"---personClass1:%p",personClass1); NSLog(@"---metaClass:%p",metaClass);
輸出結果如下:
2020-01-04 14:41:00.913734+0800 ClassDemo[8504:147077] >---personClass1:0x1043e4588 2020-01-04 14:41:00.913919+0800 ClassDemo[8504:147077] >---metaClass:0x1043e4560
【小結】:
下面這張圖詮釋了isa和superclass的精髓。
01.jpg【isa】
① instance(實例)對象的ISA指向Class(類)對象。
② class對象的ISA指向meta-class(元類)對象。
③ meta-class對象的ISA指向基類meta-class.【superclass】
① class對象的superclass指向父類的類對象。
如果沒有父類,superclass指針為nil
②meta-class的superclass指向父類的meta-class
③基類的meta-class的superclass指向基類的class
OC中類對象的學習記錄在這里。