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

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

作者: 8fe8946fa366 | 来源:发表于2018-03-31 20:09 被阅读9次

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条

      本文链接:https://www.haomeiwen.com/subject/kulncftx.html