Objective-C本質上是一門非常動態(tài)的語言,NSObject定義了幾個方法蚌卤,令開發(fā)者可以隨意調用任何方法。這幾個方法可以推遲執(zhí)行方法調用逊彭,也可以指定運行方法所用的線程咸灿。這些功能原來很有用,但是在出現(xiàn)了大中樞派發(fā)及塊這樣的新技術之后侮叮,就顯得不那么必要了避矢,最好是避開它們。
其中最簡單的是
"performSelector:(SEL)selector"
該方法與直接調用選擇子等效,所以下面兩行代碼的執(zhí)行效果等效:
[object performSelector:@selector(selectorName)];
[object selectorName];
使用此方式調用方法审胸,編譯器可能會發(fā)出如下警示信息:
warning: performSelector may cause a leak because its selector is unknown [-Warc-performSelector-leaks]
因為編譯器并不知道將要調用的選擇子是什么亥宿,也就不了解其方法簽名及返回值,甚至連是否有返回值都不清楚砂沛。而且烫扼,由于編譯器不知道方法名,所以就沒辦法運用ARC的內存管理規(guī)則來判定返回值是不是應該釋放尺上。鑒于此材蛛,ARC采用了比較謹慎的做法怎抛,就是不添加釋放操作。然而這么做可能導致內存泄露芽淡,因為方法在返回對象時可能已經將其保留了马绝。