本文為大地瓜原創(chuàng),歡迎知識共享,轉(zhuǎn)載請注明出處。
雖然你不注明出處我也沒什么精力和你計較。
作者微信號:christgreenlaw
本節(jié)主要學(xué)習(xí)了對OC類的分析。
類的本質(zhì)
類在OC中也是一個對象,這個類對象會在類第一次被使用時創(chuàng)建。
有了類對象后,可以通過類對象來創(chuàng)建實例對象。
實例對象中有一個isa結(jié)構(gòu),指向自己的類對象。
類對象中保存了該類的所有對象方法,當給一個實例對象發(fā)送消息時,會到實例對象isa指針對應(yīng)的類對象中查找。
若要獲取類對象,則向類名或者實例對象發(fā)送class消息,將會獲得一個Class類型的對象,也就是類對象。
Person *p1 = [[Person alloc]init];
Person *p2 = [[Person alloc]init];
Class c1 = [p1 class];
Class c2 = [p2 class];
Class c3 = [Person class];
NSLog(@"c1 = %p, c2 = %p, c3 = %p", c1, c2, c3);
//一個類在內(nèi)存中只有一個類對象

類對象的輸出.png
類對象能用來干嘛呢?
創(chuàng)建實例對象
Person *p3 = [[c1 alloc] init];
調(diào)用類方法
[c1 test];
其實類對象的使用方法和類名是一樣的。
類的加載邏輯
當程序啟動時,所有的類代碼就會加載到內(nèi)存中
load方法會在當前類被加載到內(nèi)存時調(diào)用,且只會調(diào)用一次
如果存在繼承關(guān)系,則會先調(diào)用父類的load方法,在調(diào)用子類的load方法(此時類對象還沒有創(chuàng)建,只是類代碼加載到了內(nèi)存中)
當前類第一次使用到的時候回調(diào)用initialize方法(也就是創(chuàng)建類對象時)
initialize方法只會被調(diào)用一次
initialize方法用于對某個類進行一次性的初始化
如果存在繼承關(guān)系,則會先調(diào)用父類的initialize方法,在調(diào)用子類的initialize方法