本篇文章给大家谈谈深入探讨 performSelector:afterDelay: 使用中的潜在问题及解决方案,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1");
[self PerformSelector:@selector(test) withObject:nil afterDelay:0];
NSLog(@"2");
});
}
-(无效)测试{
NSLog(@"3");
}这段代码的执行结果是1, 2
原因
因为- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay 实际上是在runloop 中,是一个定时器,但是因为子线程的原因,默认不启用runloop
以下是Apple API的注释,解释了这个问题:
image.png想要执行-(void)test方法,官方文档也提供了解决方案:
[self PerformSelectorOnMainThread:@selector(test) withObject:nil waitUntilDone:YES];其实对于上面的逻辑,比较简单的是:
[self PerformSelector:@selector(test) withObject:nil];如果没有参数,可以更简单:
[自我执行Selector:@selector(测试)];
思考
其实我们常用的执行就是头文件NSObject.h的方法;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
可以延迟的是NSRunLoop.h下的方法;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
前面提到的对主线程的回调是NSThread.h中的方法:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)等待;
虽然都是NSObject的方法或者分类补充方法,但实际上它们属于不同的模块;
对比上面三个方法,后两个方法没有返回值。这实际上是基于官方的评论:
图片.png图片.png
我们许多人应该总是被上述警告所困扰。大多数人的解决方案是使用类似于以下的方法来阻止警告。这种做法虽然简单,但其实是有风险的:
#pragma clang 诊断推送
#pragma clang 诊断忽略了“-Warc-performSelector-leaks”
//代码
#pragma clang Diagnostic pop 其实除了使用IMP或者NSInitation这种比较“高端”的方法之外,更多的情况下,当方法没有返回值,或者我们不需要返回值的时候,我们可以使用:
【深入探讨 performSelector:afterDelay: 使用中的潜在问题及解决方案】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
学习iOS编程遇到难题了,这篇文章正好解决了我的困惑!
有6位网友表示赞同!
performSelector:afterDelay好用又容易出错,真的要好好关注这些细节啊!
有14位网友表示赞同!
感觉程序员还是要时刻保持谨慎,避免这类坑货!
有12位网友表示赞同!
看了标题就知道是讲一些技巧性知识了,期待深入了解!
有20位网友表示赞同!
学习编程确实需要注意细枝末节,这篇文章给我提了个醒!
有10位网友表示赞同!
有时候就喜欢这种深入分析的文章,能让我了解更多知识!
有12位网友表示赞同!
我对iOS开发一直感兴趣,希望能从这篇阅读中有所帮助!
有10位网友表示赞同!
这个 "performSelector:afterDelay:" 真的很有用,之前没怎么掌握好!
有13位网友表示赞同!
"一个坑" 就是说它容易出问题吗?赶紧来学习下避免!
有6位网友表示赞同!
文章内容肯定非常专业,我得好好看看!
有17位网友表示赞同!
iOS开发的知识点很多,还是要多积累经验!
有10位网友表示赞同!
这种深入思考的文章让人受益良多,期待作者继续分享!
有14位网友表示赞同!
学习编程需要静心思考和总结,这次就来跟着这篇文章学点东西吧!
有9位网友表示赞同!
希望能了解一些解决问题的技巧,改进自己的代码水平!
有9位网友表示赞同!
我一直想探索iOS开发的深度内容,这篇文正好符合我的需求!
有20位网友表示赞同!
学习新知识的过程总是让人兴奋,准备好迎接挑战了!
有6位网友表示赞同!
从标题就能看出文章的重点在于分析和思考,很有实用价值!
有19位网友表示赞同!
这篇文章肯定能帮我解决我在iOS开发过程中遇到的问题!
有17位网友表示赞同!
多读这种注重细节的文章可以提升我的编程能力!
有17位网友表示赞同!
学习技术需要耐心和坚持,加油!
有5位网友表示赞同!