深入探讨 performSelector:afterDelay: 使用中的潜在问题及解决方案

更新:11-15 民间故事 我要投稿 纠错 投诉

本篇文章给大家谈谈深入探讨 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这种比较“高端”的方法之外,更多的情况下,当方法没有返回值,或者我们不需要返回值的时候,我们可以使用:

用户评论

殃樾晨

学习iOS编程遇到难题了,这篇文章正好解决了我的困惑!

    有6位网友表示赞同!

笑傲苍穹

performSelector:afterDelay好用又容易出错,真的要好好关注这些细节啊!

    有14位网友表示赞同!

命运不堪浮华

感觉程序员还是要时刻保持谨慎,避免这类坑货!

    有12位网友表示赞同!

花海

看了标题就知道是讲一些技巧性知识了,期待深入了解!

    有20位网友表示赞同!

艺菲

学习编程确实需要注意细枝末节,这篇文章给我提了个醒!

    有10位网友表示赞同!

念旧是个瘾。

有时候就喜欢这种深入分析的文章,能让我了解更多知识!

    有12位网友表示赞同!

短发

我对iOS开发一直感兴趣,希望能从这篇阅读中有所帮助!

    有10位网友表示赞同!

发型不乱一切好办

这个 "performSelector:afterDelay:" 真的很有用,之前没怎么掌握好!

    有13位网友表示赞同!

面瘫脸

"一个坑" 就是说它容易出问题吗?赶紧来学习下避免!

    有6位网友表示赞同!

久爱不厌

文章内容肯定非常专业,我得好好看看!

    有17位网友表示赞同!

水波映月

iOS开发的知识点很多,还是要多积累经验!

    有10位网友表示赞同!

如梦初醒

这种深入思考的文章让人受益良多,期待作者继续分享!

    有14位网友表示赞同!

日久见人心

学习编程需要静心思考和总结,这次就来跟着这篇文章学点东西吧!

    有9位网友表示赞同!

长裙绿衣

希望能了解一些解决问题的技巧,改进自己的代码水平!

    有9位网友表示赞同!

容纳我ii

我一直想探索iOS开发的深度内容,这篇文正好符合我的需求!

    有20位网友表示赞同!

堕落爱人!

学习新知识的过程总是让人兴奋,准备好迎接挑战了!

    有6位网友表示赞同!

一纸愁肠。

从标题就能看出文章的重点在于分析和思考,很有实用价值!

    有19位网友表示赞同!

发呆

这篇文章肯定能帮我解决我在iOS开发过程中遇到的问题!

    有17位网友表示赞同!

红尘滚滚

多读这种注重细节的文章可以提升我的编程能力!

    有17位网友表示赞同!

空巷

学习技术需要耐心和坚持,加油!

    有5位网友表示赞同!

【深入探讨 performSelector:afterDelay: 使用中的潜在问题及解决方案】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

上一篇:文字录入兼职平台推荐:正规打字接单APP排行榜 下一篇:探索历史:开卷考试的魅力与挑战