類的本質(zhì)
-
本質(zhì)
- 類其實(shí)也是一個(gè) 對象, 這個(gè)對象會(huì)在這個(gè)類第一次被使用的時(shí)候創(chuàng)建, 一個(gè)類再內(nèi)存中只有一份類對象
- 只要有了類對象, 將來就可以通過類對象來創(chuàng)建實(shí)例對象
- 實(shí)例對象中有一個(gè)
isa指針
, 指向創(chuàng)建自己的類對象 - 類對象中保存了當(dāng)前對象所有的對象方法, 當(dāng)給一個(gè)實(shí)例對象發(fā)送消息的時(shí)候, 會(huì)根據(jù)實(shí)例對象中的isa指針去對應(yīng)的類對象中查找
- 如何獲取類對象: [實(shí)例對象 class]/ [類名 class];
-
類對象的應(yīng)用場景:
- 1用于創(chuàng)建實(shí)例對象
- 2用于調(diào)用類方法
類的啟動(dòng)過程
-
load
方法:- 只要程序啟動(dòng)就會(huì)將所有類的代碼加載到內(nèi)存中, 放到代碼區(qū)
-
load
方法會(huì)在當(dāng)前類被 加載到內(nèi)存 的時(shí)候調(diào)用, 有且僅會(huì) 調(diào)用一次 - 如果存在繼承關(guān)系, 會(huì) 先調(diào)用父類的load方法, 再調(diào)用子類的load方法
-
initialize
方法:- 當(dāng)前類第一次被使用的時(shí)候就會(huì)調(diào)用(創(chuàng)建類對象的時(shí)候)
-
initialize
方法在整個(gè)程序的運(yùn)行過程中只會(huì)被 調(diào)用一次, 無論使用多少次這個(gè)類都只會(huì)調(diào)用一次 -
initialize
用于對某一個(gè)類進(jìn)行 一次性的初始化 -
initialize
和load
一樣, 如果存在繼承關(guān)系, 會(huì) 先調(diào)用父類的initialize, 再調(diào)用子類的initialize
SEL類型
三種用法
- 配合對象/類來 檢查 對象/類中有沒有實(shí)現(xiàn)某一個(gè)方法
SEL sel = @selector(setAge:);
Person *p = [Person new];
// 判斷p對象中有沒有實(shí)現(xiàn)-號(hào)開頭的setAge:方法
// 如果P對象實(shí)現(xiàn)了setAge:方法那么就會(huì)返回YES
// 如果P對象沒有實(shí)現(xiàn)setAge:方法那么就會(huì)返回NO
BOOL flag = [p respondsToSelector:sel];
NSLog(@"flag = %i", flag);
- 2.配合對象/類來 調(diào)用某一個(gè)SEL方法
SEL sel = @selector(demo);
Person *p = [Person new];
// 調(diào)用p對象中sel類型對應(yīng)的方法
[p performSelector:sel];
SEL sel1 = @selector(signalWithNumber:);
// withObject: 需要傳遞的參數(shù)
// 注意: 如果通過performSelector調(diào)用有參數(shù)的方法, 那么參數(shù)必須是對象類型,
// 也就是說方法的形參必須接受的是一個(gè)對象, 因?yàn)閣ithObject只能傳遞一個(gè)對象
[p performSelector:sel1 withObject:@"13838383438"];
SEL sel2 = @selector(setAge:);
[p performSelector:sel2 withObject:@(5)];
NSLog(@"age = %i", p.age);
// 注意:performSelector最多只能傳遞2個(gè)參數(shù)
SEL sel3 = @selector(sendMessageWithNumber:andContent:);
[p performSelector:sel3 withObject:@"138383438" withObject:@"abcdefg"];
- 3.配合對象 將SEL類型作為方法的形參
Car *c = [Car new];
SEL sel = @selector(run);
Person *p = [Person new];
[p makeObject:c andSel:sel];// 調(diào)用傳入對象的指定方法, 此處是c的run方法