一、SEL 類成員方法的指針
可以理解 @selector()就是取類方法的編號,他的行為基本可以等同C語言中的函數(shù)指針,只不過C語言中,可以把函數(shù)名直接賦給一個函數(shù)指針端仰,而Objective-C的類不能直接應(yīng)用函數(shù)指針捻激,這樣只能做一個@selector語法來取。它的結(jié)果是一個SEL類型灯谣,這個類型本質(zhì)是類方法的編號(函數(shù)地址)。
Objective-C 數(shù)據(jù)結(jié)構(gòu)中,存在一個 name - selector 的映射表如圖:
方法以 selector 作為索引蛔琅。 selector 的數(shù)據(jù)類型是 SEL. 雖然 SEL 定義成 char*, 我們可 以把它想象成 int. 每個方法的名字對應(yīng)一個唯一的 int 值胎许。比如, 方法 addObject: 可能 對應(yīng)的是 12。?當(dāng)尋找該方法時, 使用的是 selector,而不是名字 @"addObject:"
在編譯的時候, 只要有方法的調(diào)用, 編譯器都會通過 selector 來查找,所以 (假設(shè) addObject 的 selector 為 12)
[myObject addObject:yourObject];
將會編譯變成:
objc_msgSend(myObject, 12, yourObject);
這里,objec_msgSend()函數(shù)將會使用 myObjec 的 isa 指針來找到 myObject 的類空間結(jié)構(gòu)罗售,并在類空間結(jié)構(gòu)中查找 selector 12 所對應(yīng)的方法辜窑。如果沒有找到,那么將使用指向父類的指 針找到父類空間結(jié)構(gòu)進(jìn)行 selector 12 的查找。 如果仍然沒有找到,就繼續(xù)往父類的父類一 直找,直到找到為止, 如果到了根類 NSObject 中仍然找不到,將會拋出異常寨躁。
二穆碎、SEL對象的創(chuàng)建
SEL s = @selector(test);
SEL s2 = NSSelectorFromString(@"test");
三、SEL對象的其他用法
// 將SEL對象轉(zhuǎn)為NSString對象
NSString *str = NSStringFromSelector(@selector(test));
Person *p = [Person new];
// 調(diào)用對象p的test方法
[p performSelector:@selector(test)];
// 對一個數(shù)組array的每個元素執(zhí)行一次test方法
[array makeObjectsPerformSelector:@selector(test)];
[array makeObjectsPerformSelector:@selector(test) ?withObject:@"aaa"];
//對一個數(shù)組array進(jìn)行排序
[array sortedArrayUsingSelector:@selector(compare:)];
參考鏈接:http://blog.csdn.net/fengsh998/article/details/8614486