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

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

织梦DEDECMS即将授权收费和维权模式 站长应对的几个方法

这两天在站长群里看到不少有使用DEDECMS织梦程序的朋友比较着急,因为前两天有看到来自DEDECMS,我们熟悉的织梦程序官方发布的公告,将会在10月25日开始全面商业用途的使用DEDECMS内容管理程序的会采用授权收费模式,如果我们有在个人或者企业商业用途的,需要联系且得到授权才可以使用,否则后面会通过维权的方式。对于这个事情,我们可能有些站长经历过,比如字体、图片的版权。以及有一些国内的CMS...

DiyVM独立服务器:香港沙田服务器,5M带宽CN2线路,L5630*2/16G内存/120G SSD硬盘,499元/月

diyvm怎么样?diyvm商家VPS主机均2GB内存起步,三个地区机房可选,使用优惠码后每月69元起;DiyVM独立服务器开设在香港沙田电信机房,CN2线路,5M带宽,自动化开通上架,最低499元/月,配置是L5630*2/16G内存/120G SSD硬盘。DiyVM是一家成立于2009年的国人主机商,提供的产品包括VPS主机、独立服务器租用等,产品数据中心包括中国香港、日本大阪和美国洛杉矶等,...

TabbyCloud周年庆&七夕节活动 美國INAP 香港CN2

TabbyCloud迎来一周岁的生日啦!在这一年里,感谢您包容我们的不足和缺点,在您的理解与建议下我们也在不断改变与成长。为庆祝TabbyCloud运营一周年和七夕节,TabbyCloud推出以下活动。TabbyCloud周年庆&七夕节活动官方网站:https://tabbycloud.com/香港CN2: https://tabbycloud.com/cart.php?gid=16购买链...

performselector为你推荐
waze马来西亚中文导航waze地图mac地址克隆无线路由器mac地址克隆有什么用处?at89s52单片机AT89S52单片机和AT89C51单片机的区别知识分享平台关于分享职场技能的知识付费平台,大家有什么好推荐的吗?自定义表情QQ自定义表情防火墙排名目前比较好的防火墙软件有哪些?印度尼西亚国家代码谁知道世界各国的国家电话代码?数据挖掘项目什么是数据挖掘?从事相关的工作有什么要求?数据挖掘项目怎样利用大数据挖掘农业项目发展前景遗传算法实例求助fortran语言编写的混合遗传算法例子那位大哥大姐有?
omnis qq数据库 合肥鹏博士 本网站服务器在美国 100m免费空间 双十一秒杀 cdn加速原理 傲盾官网 卡巴斯基是免费的吗 华为云服务登录 宏讯 linode支付宝 国外的代理服务器 中国域名 网站加速 存储服务器 云销售系统 789电视剧网 shuangcheng ftp是什么东西 更多