SEL(@selector)基本知識(shí)

一、SEL 類成員方法的指針

可以理解 @selector()就是取類方法的編號(hào),他的行為基本可以等同C語(yǔ)言中的函數(shù)指針,只不過C語(yǔ)言中,可以把函數(shù)名直接賦給一個(gè)函數(shù)指針,而Objective-C的類不能直接應(yīng)用函數(shù)指針,這樣只能做一個(gè)@selector語(yǔ)法來(lái)取。它的結(jié)果是一個(gè)SEL類型,這個(gè)類型本質(zhì)是類方法的編號(hào)(函數(shù)地址)。

Objective-C 數(shù)據(jù)結(jié)構(gòu)中,存在一個(gè) name - selector 的映射表如圖:

The?Selector?table

方法以 selector 作為索引。 selector 的數(shù)據(jù)類型是 SEL. 雖然 SEL 定義成 char*, 我們可 以把它想象成 int. 每個(gè)方法的名字對(duì)應(yīng)一個(gè)唯一的 int 值。比如, 方法 addObject: 可能 對(duì)應(yīng)的是 12。?當(dāng)尋找該方法時(shí), 使用的是 selector,而不是名字 @"addObject:"

在編譯的時(shí)候, 只要有方法的調(diào)用, 編譯器都會(huì)通過 selector 來(lái)查找,所以 (假設(shè) addObject 的 selector 為 12)

[myObject addObject:yourObject];

將會(huì)編譯變成:

objc_msgSend(myObject, 12, yourObject);

這里,objec_msgSend()函數(shù)將會(huì)使用 myObjec 的 isa 指針來(lái)找到 myObject 的類空間結(jié)構(gòu),并在類空間結(jié)構(gòu)中查找 selector 12 所對(duì)應(yīng)的方法。如果沒有找到,那么將使用指向父類的指 針找到父類空間結(jié)構(gòu)進(jìn)行 selector 12 的查找。 如果仍然沒有找到,就繼續(xù)往父類的父類一 直找,直到找到為止, 如果到了根類 NSObject 中仍然找不到,將會(huì)拋出異常。

二、SEL對(duì)象的創(chuàng)建

SEL s = @selector(test);

SEL s2 = NSSelectorFromString(@"test");

三、SEL對(duì)象的其他用法

// 將SEL對(duì)象轉(zhuǎn)為NSString對(duì)象

NSString *str = NSStringFromSelector(@selector(test));

Person *p = [Person new];

// 調(diào)用對(duì)象p的test方法

[p performSelector:@selector(test)];

// 對(duì)一個(gè)數(shù)組array的每個(gè)元素執(zhí)行一次test方法

[array makeObjectsPerformSelector:@selector(test)];

[array makeObjectsPerformSelector:@selector(test) ?withObject:@"aaa"];

//對(duì)一個(gè)數(shù)組array進(jìn)行排序

[array sortedArrayUsingSelector:@selector(compare:)];


參考鏈接:http://blog.csdn.net/fengsh998/article/details/8614486

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容