performSelector系列方法是什么?
SEL selector;
if (/*一些条件*/)
{
selector = @selector(foo);
}
else if (/*其他一些条件*/)
{
selector = @selector(bar);
}
else
{
selector = @selector(baz);
}
[self performSelector:selector];
[self performSelector:(SEL) withObject:(id)];
[self performSelector:(SEL) withObject:(id) withObject:(id)];
[self performSelector:(nonnull SEL) withObject:(nullable id) afterDelay:(NSTimeInterval)];
[self performSelector:(nonnull SEL) onThread:(nonnull NSThread *) withObject:(nullable id) waitUntilDone:(BOOL)];
[self performSelectorOnMainThread:(nonnull SEL) withObject:(nullable id) waitUntilDone:(BOOL)];
为什么要多用GCD少用performSelector系列方法?
performSelector存在的问题:
1、会有内存泄漏问题,无法确定要执行的选择子具体是什么,因而ARC无法插入适当的内存管理方法;
2、返回值类型是id;
3、参数必须是id,最多只能接受两个参数;
GCD的优势:
可以不受这些限制。
怎么使用?
1、延后执行
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^
{
[self doSomething];
});
2、放到主线程执行
dispatch_async(dispatch_get_main_queue(), ^
{
[self doSomething];
});