Objective-C本质上是一门非常动态的语言,NSObject定义了几个方法,令开发者可以随意调用任何方法。
这些方法可以推迟执行方法调用,也可以指定运行方法所用的线程。其中最简单的就是performSelector。
performSelector系列方法在内存管理方法容易有疏失,它无法确定将要执行的选择器具体是什么,因此,也就不了解起方法签名及返回值,甚至是否有返回值都不清楚,因而ARC编译器也就无法插入适当的内存管理方法。
performSelector系列方法所能处理的选择器也太过局限,选择器返回值只能是void或对象类型,参数类型必须是对象类型,最多只能传两个参数,参数不止两个情况就没有对应的performSelector方法可以使用了。
如果想把任务放在另一个线程上执行,那么最后不要用performSelector系列方法,而是应该把任务封装到块里,然后调用GCD相关方法来实现。
// 延迟执行方法
// 使用performSelector
[self performSelector:@selector(doSomething) withObject:nil afterDelay:5.0];
// 使用GCD
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^(void){
[self doSomething];
});
// 在主线程中执行方法
// 使用performSelector
[self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:NO];
// 使用GCD 如果waitUntilDone为YES,则用dispatch_sync
dispatch_async(dispatch_get_main_queue(),^{
[self doSomething];
});
网友评论