42条:多用GCD,少用performSelector系列方法
1.performSelector方法动态调用方法及其问题
1.在运行时动态调用方法
[object performSelector:@selector(selectorName)];
相当于[object selectorName];
在运行时可以体现出这种方法的作用:
SEL selector
if(...){selector = @selector(xxx);}
else if(...){selector = @selector(xxx);}
else{selector = @selector(xxx);}
[object performSelector:selector];
问题:在ARC环境下,用这种方法编译器会发出警告:
⚠️.jpg为什么会发出这样的警告呢?
因为编译器不知道要调用的selector是哪一个,也就不知道这个selector有没有返回值,因此没办法用arc的内存管理规则来判定返回值是否应该释放,所以为了安全,arc选择了一缕不释放返回值,因此有可能造成内存泄漏。
2.返回值问题
performSelector方法的返回值是id类型,如果想返回整数类型或浮点型就需要进行类型转换,容易出错。
-(id)performSelector:(SEL)selector
3.传递参数
performSelector方法有两个可以传递参数的版本。
-(id)performSelector:(SEL)selector withObject:(id)object;
-(id)performSelector:(SEL)selector withObject:(id)object1 withObject:(id)object2;
局限:传递的参数必须是对象类型,并且最多只能传递两个参数,如果selector里需要传递更多数量的参数就不行了。
4.延迟执行,指定线程执行等方法
这些方法的灵活性都比较小,更推荐用gcd里的方法来实现相同的功能。
网友评论