42條:多用GCD共屈,少用performSelector系列方法
1.performSelector方法動(dòng)態(tài)調(diào)用方法及其問(wèn)題
1.在運(yùn)行時(shí)動(dòng)態(tài)調(diào)用方法
[object performSelector:@selector(selectorName)];
相當(dāng)于[object selectorName];
在運(yùn)行時(shí)可以體現(xiàn)出這種方法的作用:
SEL selector
if(...){selector = @selector(xxx);}
else if(...){selector = @selector(xxx);}
else{selector = @selector(xxx);}
[object performSelector:selector];
問(wèn)題:在ARC環(huán)境下,用這種方法編譯器會(huì)發(fā)出警告:
為什么會(huì)發(fā)出這樣的警告呢义图?
因?yàn)榫幾g器不知道要調(diào)用的selector是哪一個(gè)托嚣,也就不知道這個(gè)selector有沒(méi)有返回值汞窗,因此沒(méi)辦法用arc的內(nèi)存管理規(guī)則來(lái)判定返回值是否應(yīng)該釋放趾撵,所以為了安全,arc選擇了一縷不釋放返回值施籍,因此有可能造成內(nèi)存泄漏居扒。
2.返回值問(wèn)題
performSelector方法的返回值是id類型,如果想返回整數(shù)類型或浮點(diǎn)型就需要進(jìn)行類型轉(zhuǎn)換丑慎,容易出錯(cuò)喜喂。
-(id)performSelector:(SEL)selector
3.傳遞參數(shù)
performSelector方法有兩個(gè)可以傳遞參數(shù)的版本瓤摧。
-(id)performSelector:(SEL)selector withObject:(id)object;
-(id)performSelector:(SEL)selector withObject:(id)object1?withObject:(id)object2;
局限:傳遞的參數(shù)必須是對(duì)象類型,并且最多只能傳遞兩個(gè)參數(shù)夜惭,如果selector里需要傳遞更多數(shù)量的參數(shù)就不行了。
4.延遲執(zhí)行铛绰,指定線程執(zhí)行等方法
這些方法的靈活性都比較小诈茧,更推薦用gcd里的方法來(lái)實(shí)現(xiàn)相同的功能。