编写高质量iOS与OS X代码的52个有效方法--第42条

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里的方法来实现相同的功能。

你可能感兴趣的:(编写高质量iOS与OS X代码的52个有效方法--第42条)