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

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

Vultr新注册赠送100美元活动截止月底 需要可免费享30天福利

昨天晚上有收到VULTR服务商的邮件,如果我们有清楚的朋友应该知道VULTR对于新注册用户已经这两年的促销活动是有赠送100美元最高余额,不过这个余额有效期是30天,如果我们到期未使用完的话也会失效的。但是对于我们一般用户来说,这个活动还是不错的,只需要注册新账户充值10美金激活账户就可以。而且我们自己充值的余额还是可以继续使用且无有效期的。如果我们有需要申请的话可以参考"2021年最新可用Vul...

VPS云服务器GT线路,KVM虚vps消息CloudCone美国洛杉矶便宜年付VPS云服务器补货14美元/年

近日CloudCone发布了最新的补货消息,针对此前新年闪购年付便宜VPS云服务器计划方案进行了少量补货,KVM虚拟架构,美国洛杉矶CN2 GT线路,1Gbps带宽,最低3TB流量,仅需14美元/年,有需要国外便宜美国洛杉矶VPS云服务器的朋友可以尝试一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器...

Hostodo(年付$34.99), 8TB月流量 3个机房可选

Hostodo 算是比较小众的海外主机商,这次九月份开学季有提供促销活动。不过如果我们有熟悉的朋友应该知道,这个服务商家也是比较时间久的,而且商家推进活动比较稳,每个月都有部分活动。目前有提供机房可选斯波坎、拉斯维加斯和迈阿密。从机房的地理位置和实际的速度,中文业务速度应该不是优化直连的,但是有需要海外业务的话一般有人选择。以前一直也持有他们家的年付12美元的机器,后来用不到就取消未续约。第一、开...

performselector为你推荐
mac地址克隆路由器中的MAC地址克隆,是什么,干嘛用的eagleeye《鹰眼》的男主角是谁?y码S`M`XXL`L`XL身高体重分别是多少?视频技术视频编辑是干什么的,主要是做一些什么工作呢?这个职位好不好?发展前景怎么样?国产操作系统下载国产操作系统要钱吗防火墙排名目前比较好的防火墙软件有哪些?鄂n鄂A鄂B鄂C鄂D鄂E鄂F鄂G鄂H鄂J鄂K鄂L鄂M鄂N鄂P鄂Q鄂R鄂S鄂T鄂U分别代表湖北省的哪些城市数据挖掘项目什么是数据挖掘?从事相关的工作有什么要求?什么是生态系统生态系统的基础是什么?微信智能机器人有没有可以拉进微信群的聊天机器人
主机域名 政务和公益机构域名注册管理中心 免费申请网站域名 企业域名备案 西安服务器 duniu plesk raksmart mobaxterm 亚洲小于500m 智能骨干网 lol台服官网 中国网通测速 gtt 空间首页登陆 测速电信 睿云 双十二促销 小夜博客 hdroad 更多