Objective-C本質(zhì)上是一門非常動(dòng)態(tài)的語言,NSObject定義了幾個(gè)方法,令開發(fā)者可以隨意調(diào)用任何方法。這幾個(gè)方法可以推遲執(zhí)行方法調(diào)用,也可以指定運(yùn)行方法所用的線程。這些功能原來很有用,但是在出現(xiàn)了大中樞派發(fā)及塊這樣的新技術(shù)之后,就顯得不那么必要了,最好是避開它們。
其中最簡(jiǎn)單的是
"performSelector:(SEL)selector"
該方法與直接調(diào)用選擇子等效,所以下面兩行代碼的執(zhí)行效果等效:
[object performSelector:@selector(selectorName)];
[object selectorName];
使用此方式調(diào)用方法,編譯器可能會(huì)發(fā)出如下警示信息:
warning: performSelector may cause a leak because its selector is unknown [-Warc-performSelector-leaks]
因?yàn)榫幾g器并不知道將要調(diào)用的選擇子是什么,也就不了解其方法簽名及返回值,甚至連是否有返回值都不清楚。而且,由于編譯器不知道方法名,所以就沒辦法運(yùn)用ARC的內(nèi)存管理規(guī)則來判定返回值是不是應(yīng)該釋放。鑒于此,ARC采用了比較謹(jǐn)慎的做法,就是不添加釋放操作。然而這么做可能導(dǎo)致內(nèi)存泄露,因?yàn)榉椒ㄔ诜祷貙?duì)象時(shí)可能已經(jīng)將其保留了。