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词典就可以了,完成了代码的归一。

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

随风云25元/月 ,德阳高防云服务器 2核2G 10M 75元/月 内蒙古三线BGP服务器 2核2G 5M

公司介绍成都随风云科技有限公司成立于2021年,是国内领先的互联网业务平台服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、双线高防、香港等优质的IDC资源。公司一直秉承”以人为本、客户为尊、永续创新&...

2022年腾讯云新春采购季代金券提前领 领取满减优惠券和域名优惠

2022年春节假期陆续结束,根据惯例在春节之后各大云服务商会继续开始一年的促销活动。今年二月中旬会开启新春采购季的活动,我们已经看到腾讯云商家在春节期间已经有预告活动。当时已经看到有抢先优惠促销活动,目前我们企业和个人可以领取腾讯云代金券满减活动,以及企业用户可以领取域名优惠低至.COM域名1元。 直达链接 - 腾讯云新春采购活动抢先看活动时间:2022年1月20日至2022年2月15日我们可以在...

CUBECLOUD:香港服务器、洛杉矶服务器、全场88折,69元/月

CUBECLOUD(魔方云)成立于2016年,亚太互联网络信息中心(APNIC)会员,全线产品均为完全自营,专业数据灾备冗余,全部产品均为SSD阵列,精品网络CN2(GIA) CU(10099VIP)接入,与当今主流云计算解决方案保持同步,为企业以及开发者用户实现灵活弹性自动化的基础设施。【夏日特促】全场产品88折优惠码:Summer_2021时间:2021年8月1日 — 2021年8月8日香港C...

performselector为你推荐
刘建平有个太极八卦紫砂壶,刘建平制,值多少钱?帮鉴定下企鹅医生企鹅医生里的医生是真的么?可信么?李智慧韩智慧的资料谁有啊?详细的哦~~vga接口定义VGA接口的15针分别接什么?扫图高清扫图是什么意思,在很多的贴吧里,都有提到一些高清扫图,是自己照杂志上的图片,然后自己再修一下吗awvawv转换器哪里下?数据挖掘项目怎样利用大数据挖掘农业项目发展前景天翼校园宽带天翼校园宽带怎么样用手机打开这个页面登陆papertiger亚瑟士 艾斯克斯 tiger有什么区别吗文本框透明html怎么把这个文本框变为透明?
域名升级访问中 西安域名注册 yardvps 加勒比群岛 免费个人博客 一点优惠网 元旦促销 工信部icp备案号 699美元 php空间购买 vip购优惠 监控服务器 asp空间 tracker服务器 九零网络 2016黑色星期五 机柜尺寸 server2008 ddos攻击 紫田网络 更多