performselector在OC 中,给对象发送一个消息,与 通过@selector 发送一个消息有什么区别 ?

performselector  时间:2021-06-02  阅读:()

ios performselector:withobject:withobject:怎么解决

必须保证调用performSelector:withObject:afterDelay:是在主线程中。

但没有测试在子线程中再创建个NSTimer用来延迟,应该也可以,反正直接用[NSTimer timerWithTimeInterval:invocation:repeats:]是不行的。

特实现 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 方法,保证在主线程中调用成功 // NSObject_performSelectorEx.h @interface NSObject (performSelectorEx) - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; @end // NSObject_performSelectorEx.m #import "NSObject_performSelectorEx.h" @implementation NSObject (performSelectorEx) - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay { NSMethodSignature *sig = [self methodSignatureForSelector:aSelector]; if (!sig) { return; } NSInvocation *invo = [NSInvocation invocationWithMethodSignature:sig]; [invo setTarget:self]; [invo setSelector:aSelector]; [invo setArgument:&anArgument atIndex:2]; [invo retainArguments]; NSMethodSignature *sigMT = [invo methodSignatureForSelector:@selector(performSelector:withObject:afterDelay:)]; NSInvocation *invoMT = [NSInvocation invocationWithMethodSignature:sigMT]; [invoMT setTarget:invo]; [invoMT setSelector:@selector(performSelector:withObject:afterDelay:)]; SEL arg1 = @selector(invoke); void *arg2 = nil; NSTimeInterval arg3 = delay; [invoMT setArgument:&arg1 atIndex:2]; [invoMT setArgument:&arg2 atIndex:3]; [invoMT setArgument:&arg3 atIndex:4]; [invoMT retainArguments]; [invoMT performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:NO]; } @end

怎样关闭之前打开的窗口?

真的不好弄!有些教程是出栈[self performSelector:@selector(doPush:) withObject:self.navigationController afterDelay:0.05f];[ViewController];[self.navigationController popViewControllerAnimated:NO];[ViewController];[self.navigationController popViewControllerAnimated:NO];第一次popViewControllerAnimated:还好。

第二次popViewControllerAnimated:就不行了。

但栈是空的了。

doPush:重新打开C ViewController.

在OC 中,给对象发送一个消息,与 通过@selector 发送一个消息有什么区别 ?

不知道你的基础如何? 我就简单说一点吧。

例如People类继承于NSObject, 它有一个eat方法。

你创建了一个对象People *p = [People new]; 然后你可以使用[p eat]或者 [p perfomSelector:@selector(eat)]来。

两种到底有什么区别? 其实对于方法调用本身来说,都是调用eat方法,但是performSelector提供了一种间接性,它可以通过传入不同的selector来调用不同的方法。

[p eat]对于编译器来说,内部应该会编译成[p performSelector:@selector(eat)]的方法,这个是我的猜想。

然后在运行时期,根据@selector(eat)得到的方法字符串SEL得到eat方法的实现代码的函数指针IMP, 然后调用以C语言的方式使用eatImp(p, @selector(eat);来调用eat方法。

实际上对于上面的两个区别,你可能会用到的是这种情况。

在头文件.h中你不声明eat,在外部使用People时候,你不能使用[p eat],但你可以使用performSelector的方式,这是由于编译器在[p eat]就根本不让你编译通过, performSelector是运行期的事情,编译器只会给出警告,不会阻拦你,会有更好的灵活性。

对于上面两个方法还有一点,performSelector相当于是一个控制中心,它可以接收selector来进行调用不同的方法。

这相当于apple给我们一个自己统一处理方法的机会。

例如我们需要做一个消息控制中心,根据不同的消息调用不同的方法,我可以写出这样的代码: void processMethodByMsg:(NSString*)methodName { NSDictionary* methodDic = @{@"eat": @selector(eat), @"drink":@selector(drink), @"sleep":@selector(sleep)}; [p performSelector:methodDic[methodName]]; } 通过一个dic就完成了字符串和方法的映射,methodName是由外部输入的消息名字,需要修改或者添加的时候,你仅仅需要修改dic词典就可以了,完成了代码的归一。

好了,啰啰嗦嗦十分钟了,希望能给你一些帮助。

青果云(590元/年),美国vps洛杉矶CN2 GIA主机测评 1核1G 10M

青果网络QG.NET定位为高效多云管理服务商,已拥有工信部颁发的全网云计算/CDN/IDC/ISP/IP-VPN等多项资质,是CNNIC/APNIC联盟的成员之一,2019年荣获国家高薪技术企业、福建省省级高新技术企业双项荣誉。那么青果网络作为国内主流的IDC厂商之一,那么其旗下美国洛杉矶CN2 GIA线路云服务器到底怎么样?官方网站:https://www.qg.net/CPU内存系统盘流量宽带...

RAKsmart秒杀服务器$30/月,洛杉矶/圣何塞/香港/日本站群特价

RAKsmart发布了9月份优惠促销活动,从9月1日~9月30日期间,爆款美国服务器每日限量抢购最低$30.62-$46/月起,洛杉矶/圣何塞/香港/日本站群大量补货特价销售,美国1-10Gbps大带宽不限流量服务器低价热卖等。RAKsmart是一家华人运营的国外主机商,提供的产品包括独立服务器租用和VPS等,可选数据中心包括美国加州圣何塞、洛杉矶、中国香港、韩国、日本、荷兰等国家和地区数据中心(...

Sharktech:鲨鱼机房1Gbps无限流量美国服务器;丹佛$49/月起,洛杉矶$59/月起

sharktech怎么样?sharktech鲨鱼机房(Sharktech)我们也叫它SK机房,是一家成立于2003年的老牌国外主机商,提供的产品包括独立服务器租用、VPS主机等,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹等,主打高防产品,独立服务器免费提供60Gbps/48Mpps攻击防御。机房提供1-10Gbps带宽不限流量服务器,最低丹佛/荷兰机房每月49美元起,洛杉矶机房最低59美元...

performselector为你推荐
病历单我想请两天病假,病例单怎么写qq业务查询怎么查询别人为我开通的QQ业务?mac地址克隆怎么克隆MAC地址?mac地址克隆路由器的Mac地址克隆有什么作用?企业资源管理系统企业人力资源管理系统的重要性?orphanremoval我的电脑开机时自检,出现许多这样的字样:Deleting orphan file record segment XXXX (XXXX代表数字)。腾讯年终奖腾讯qq一年盈利多少?awv请问awv是什么样的格式啊?js后退多级页面间的后退如何实现(js方法)腾讯技术腾讯是什么东西?
域名邮箱 域名备案批量查询 域名解析文件 justhost ix主机 一点优惠网 标准机柜尺寸 ibrs 促正网秒杀 个人域名 新天域互联 域名转接 新家坡 吉林铁通 四川电信商城 视频服务器是什么 lamp兄弟连 网页加速 大化网 带宽测试 更多