Objective-C本质上是一门非常动态的语言,NSObject定义了几个方法,令开发者可以随意调用任何方法。这几个方法可以推迟执行方法调用,也可以指定运行方法所用的线程。这些功能原来很有用,但是在出现了大中枢派发及块这样的新技术之后,就显得不那么必要了,最好是避开它们。
其中最简单的是
"performSelector:(SEL)selector"
该方法与直接调用选择子等效,所以下面两行代码的执行效果等效:
[object performSelector:@selector(selectorName)];
[object selectorName];
使用此方式调用方法,编译器可能会发出如下警示信息:
warning: performSelector may cause a leak because its selector is unknown [-Warc-performSelector-leaks]
因为编译器并不知道将要调用的选择子是什么,也就不了解其方法签名及返回值,甚至连是否有返回值都不清楚。而且,由于编译器不知道方法名,所以就没办法运用ARC的内存管理规则来判定返回值是不是应该释放。鉴于此,ARC采用了比较谨慎的做法,就是不添加释放操作。然而这么做可能导致内存泄露,因为方法在返回对象时可能已经将其保留了。
网友评论