本文為大地瓜原創(chuàng),歡迎知識(shí)共享,轉(zhuǎn)載請(qǐng)注明出處。
雖然你不注明出處我也沒(méi)什么精力和你計(jì)較。
作者微信號(hào):christgreenlaw
本節(jié)探討SEL類(lèi)型。
配合對(duì)象/類(lèi)來(lái)檢查對(duì)象/類(lèi)是否實(shí)現(xiàn)了某個(gè)方法
SEL sel = @selector(setAge:);
Person *p = [Person new];
// 判斷p對(duì)象中有沒(méi)有實(shí)現(xiàn)-號(hào)開(kāi)頭的setAge:方法
BOOL flag = [p respondsToSelector:sel];
NSLog(@"flag = %i", flag);
// respondsToSelector注意點(diǎn):
//如果是通過(guò)對(duì)象來(lái)調(diào)用該方法,會(huì)判斷該對(duì)象有沒(méi)有實(shí)現(xiàn)-號(hào)開(kāi)頭的方法
//如果是通過(guò)類(lèi)來(lái)調(diào)用該方法, 那么會(huì)判斷該類(lèi)有沒(méi)有實(shí)現(xiàn)+號(hào)開(kāi)頭的方法
SEL sel1 = @selector(test);
flag = [p respondsToSelector:sel1];
NSLog(@"flag = %i", flag);
flag = [Person respondsToSelector:sel1];
NSLog(@"flag = %i", flag);
respondsToSelector說(shuō)白了就是看receiver能不能響應(yīng)某個(gè)方法。
配合對(duì)象/類(lèi)來(lái)調(diào)用某一個(gè)SEL方法
SEL sel = @selector(demo);
Person *p = [Person new];
// 調(diào)用p對(duì)象中sel類(lèi)型對(duì)應(yīng)的方法
[p performSelector:sel];
SEL sel1 = @selector(signalWithNumber:);
// withObject: 需要傳遞的參數(shù)
// 注意: 如果通過(guò)performSelector調(diào)用有參數(shù)的方法, 那么參數(shù)必須是對(duì)象類(lèi)型, 因?yàn)閣ithObject只能傳遞一個(gè)對(duì)象
[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"];
配合對(duì)象將SEL類(lèi)型作為方法的形參
Car *c = [Car new];
SEL sel = @selector(run);
Person *p = [Person new];
[p makeObject:c andSel:sel];
Person中 makeObject: andSEL:的實(shí)現(xiàn)
- (void)makeObject:(id)obj andSel:(SEL)sel
{
[obj performSelector:sel];
}