iOS中@selector的runtime過(guò)程

大家都知道oc是動(dòng)態(tài)語(yǔ)言杨箭,是runtime的膝蜈,怎么體現(xiàn)他的動(dòng)態(tài)性呢鹅心,今天用SEL來(lái)分析下吕粗,之前分享過(guò)鉤子其實(shí)就可以看出來(lái)了,現(xiàn)在具體看看OC是怎么通過(guò)SEL找到函數(shù)的巴帮。

[self performSelector:@selector(abcd)];

[self abcd];? //這種方法可能都會(huì)編譯不過(guò)去

假如類方法里面我們便沒(méi)有寫(xiě)adcd方法溯泣,這樣就會(huì)奔潰了虐秋,oc是怎么做的呢

該方法調(diào)用后榕茧,OC會(huì)發(fā)出objc_msgSend,將消息傳給本來(lái)查找本類中的SEL是否存在Method

假設(shè)本類不存在會(huì)查找工程里是否有分類提供了該方法

假設(shè)分類中也沒(méi)有該方法客给,系統(tǒng)會(huì)將消息轉(zhuǎn)發(fā)給其父類用押,父類收到消息后也會(huì)執(zhí)行上面的操作,找方法靶剑,沒(méi)找到再往上轉(zhuǎn)發(fā)消息

假設(shè)最終都沒(méi)有找到蜻拨,就會(huì)執(zhí)行最后的消息轉(zhuǎn)發(fā)(message forwarding)操作

如果轉(zhuǎn)發(fā)出去都沒(méi)人接收的話,NSObject中的doesNotRecognizeSelector就選擇拋出異常了桩引,也就是我們看到的crash

上面的過(guò)程有點(diǎn)復(fù)雜缎讼,大家會(huì)覺(jué)得這樣很慢,第一次的確很慢坑匠,所性objc_msgSend會(huì)將匹配結(jié)果寫(xiě)到映射表中緩存起來(lái)血崭,每個(gè)類都有這樣的一塊緩存

整個(gè)過(guò)程就是上面將的那樣,我們講一下第4項(xiàng)消息轉(zhuǎn)發(fā)怎么處理吧:

消息轉(zhuǎn)發(fā)還分兩個(gè)階段:

1.動(dòng)態(tài)方法解析:意思就是說(shuō)詢問(wèn)接受者要不要增加個(gè)方法來(lái)實(shí)現(xiàn)該函數(shù)

+ (BOOL)resolveInstanceMethod:(SEL)selecotor? //對(duì)象方法

+ (BOOL)resolveClassMethod:(SEL)sel? ? ? ? ? ? //類方法

在方法里可以動(dòng)態(tài)給類增加一個(gè)方法Method

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

[self performSelector:@selector(abcd)];

}

+ (BOOL)resolveInstanceMethod:(SEL)sel {

NSString *selname = NSStringFromSelector(sel);

if ([selname isEqualToString:@"abcd"]) {

class_addMethod(self, sel, class_getMethodImplementation([self class], @selector(oklala)), method_getTypeEncoding(class_getInstanceMethod([self class], @selector(oklala))));

return YES;

}

return [super resolveInstanceMethod:sel];

}

- (void)oklala {

NSLog(@"oklala");

}

2.完整的消息轉(zhuǎn)發(fā):看看還有沒(méi)有別的對(duì)象要處理,有轉(zhuǎn)出夹纫,沒(méi)有的話封裝成NSInvocation對(duì)象處理

1)假如可以轉(zhuǎn)給別的對(duì)象處理:

- (id)forwardingTargetForSelector:(SEL)aSelector

可以將要轉(zhuǎn)發(fā)的對(duì)象返回咽瓷。

@interface abcdCaller : NSObject

@end

@implementation abcdCaller

- (void)abcd {

NSLog(@"~~~~~~");

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

[self performSelector:@selector(abcd)];

}

- (id)forwardingTargetForSelector:(SEL)aSelector {

NSLog(@"!!!!!!!!!!!!!");

return [[abcdCaller alloc] init];

}

@end

2)假如沒(méi)有對(duì)象可以轉(zhuǎn)發(fā)(完整消息轉(zhuǎn)發(fā))

- (void)forwardInvocation:(NSInvocation *)anInvocation

最后可以處理消息的機(jī)會(huì)

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

[self performSelector:@selector(abcd)];

}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {

NSMethodSignature *sig = [NSMethodSignature signatureWithObjCTypes:"@@:"];

return sig;

}

- (void)forwardInvocation:(NSInvocation *)anInvocation {

NSLog(@"~~~~%@", [anInvocation description]);

}

---------------------------------------------------凌亂的分割線-------------------------------------------------

假設(shè)你的消息轉(zhuǎn)發(fā)不處理,那么在第5步捕獲異常舰讹,也是不會(huì)奔潰的

@try {

[self performSelector:@selector(abcd)];

}

@catch (NSException *exception) {

NSLog(@"~~~~~~~~");

}

@finally {

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茅姜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子月匣,更是在濱河造成了極大的恐慌钻洒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桶错,死亡現(xiàn)場(chǎng)離奇詭異航唆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)院刁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)糯钙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人退腥,你說(shuō)我怎么就攤上這事任岸。” “怎么了狡刘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵享潜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嗅蔬,道長(zhǎng)剑按,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任澜术,我火速辦了婚禮艺蝴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸟废。我一直安慰自己猜敢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布盒延。 她就那樣靜靜地躺著缩擂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪添寺。 梳的紋絲不亂的頭發(fā)上胯盯,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音计露,去河邊找鬼博脑。 笑死楞捂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趋厉。 我是一名探鬼主播寨闹,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼君账!你這毒婦竟也來(lái)了繁堡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乡数,失蹤者是張志新(化名)和其女友劉穎椭蹄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體净赴,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳矩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玖翅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翼馆。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖金度,靈堂內(nèi)的尸體忽然破棺而出应媚,到底是詐尸還是另有隱情,我是刑警寧澤猜极,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布中姜,位于F島的核電站,受9級(jí)特大地震影響跟伏,放射性物質(zhì)發(fā)生泄漏丢胚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一受扳、第九天 我趴在偏房一處隱蔽的房頂上張望携龟。 院中可真熱鬧,春花似錦辞色、人聲如沸骨宠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至桦卒,卻和暖如春立美,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背方灾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工建蹄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碌更,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓洞慎,卻偏偏與公主長(zhǎng)得像痛单,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劲腿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉旭绒,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,732評(píng)論 0 9
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門(mén)動(dòng)態(tài)語(yǔ)言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢焦人?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,199評(píng)論 0 7
  • 繼上Runtime梳理(四) 通過(guò)前面的學(xué)習(xí)挥吵,我們了解到Objective-C的動(dòng)態(tài)特性:Objective-C不...
    小名一峰閱讀 758評(píng)論 0 3
  • 本文轉(zhuǎn)載自:http://southpeak.github.io/2014/11/03/objective-c-r...
    idiot_lin閱讀 382評(píng)論 0 0
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的,也是非常重要的花椭, 在面試過(guò)程中是經(jīng)常會(huì)被問(wèn)到的忽匈, ...
    SOI閱讀 21,821評(píng)論 3 63