Objective-C 碎碎念 6

本文為大地瓜原創(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];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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