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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容