天天看點

ios中SEL ( @selector() )簡析

在ios中SEL其實就是方法指針,方法指針的靈活性在于 若對象A想要調用對象B的某個方法,但是不知道B具體方法名稱

eg:

A中代碼如下:

-(void)performFuncWithName:(NSString *)funcName andHandler:(B *)handler
{
    if ([handler respondsToSelector:NSSelectorFromString(funcName)])
        [handler performSelector:NSSelectorFromString(funcName) withObject:nil];
}
           

在 UIButton的方法  [closeBtnaddTarget:selfaction:mSElforControlEvents:UIControlEventTouchUpInside];就是這樣實作的靈活調用。

到現在可以發現,當我們使用回調邏輯的時候,既可以使用@selector這種方式,也可以使用block方式,也可以使用代理的方式。具體什麼情況下使用何種方式實作回調呢,可以從系統空間裡面找到顯而易見的一些規律,當這個空間比較簡單,回調需求就是一種情況的時候(比如button常見監聽回調就是簡單的一次點選),@selector 或者block方式均可,系統習慣使用@selector方法;當這個空間比較複雜,調用情況比較多的時候,比如UIScrollView 有開始滾動,滾動中,結束滾動,加速,減速等等,這樣用@selector顯然不友善,block方法也不夠友善,而使用代理,選擇自己要回調的方法,靈活使用是更好的選擇。

ios中是個動态運作時語言,無處不在的消息通知調用機制(@selector就是最典型的),讓其在運作時有了真正的形參和調用方法,有了極高的靈活性。