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

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

RackNerd 2022春节促销提供三款年付套餐 低至年付10.88美元

RackNerd 商家我们应该是比较熟悉的商家,速度一般,但是人家便宜且可选机房也是比较多的,较多集中在美国机房。包括前面的新年元旦促销的时候有提供年付10美元左右的方案,实际上RackNerd商家的营销策略也是如此,每逢节日都有活动,配置简单变化,价格基本差不多,所以我们网友看到没有必要囤货,有需要就选择。RackNerd 商家这次2022农历新年也是有几款年付套餐。低至RackNerd VPS...

阿里云香港 16核32G 20M 999元/月

阿里云香港配置图提速啦是成立于2012年的十分老牌的一个商家这次给大家评测的是 阿里云香港 16核32G 20M 这款产品,单单说价格上就是十分的离谱原价8631元/月的现价只要 999元 而且还有个8折循环优惠。废话不多说直接进入正题。优惠时间 2021年8月20日-2021年9月20日 优惠码 wn789 8折优惠阿里云香港BGP专线 16核32G 10M带宽 优惠购买 399元购买链接阿里云...

美国G口/香港CTG/美国T级超防云/湖北高防云服务器物理机促销活动 六一云

六一云 成立于2018年,归属于西安六一网络科技有限公司,是一家国内正规持有IDC ISP CDN IRCS电信经营许可证书的老牌商家。大陆持证公司受大陆各部门监管不好用支持退款退现,再也不怕被割韭菜了!主要业务有:国内高防云,美国高防云,美国cera大带宽,香港CTG,香港沙田CN2,海外站群服务,物理机,宿母鸡等,另外也诚招代理欢迎咨询。官网www.61cloud.net最新直销劲爆...

performselector为你推荐
华为总裁女儿为啥姓孟孟晚舟姓孟,任正非姓任,孟晚舟怎么是任正非的女?人肉搜索引擎人肉搜索引擎是干什么的?单元测试规范如何做好小学数学单元测试工作kjavaKJAVA业务信息费是什么东西啊,我怎么会被莫莫名其妙的扣掉11元啊移动硬盘文件或目录损坏且无法读取急:移动硬盘无法访问,打开提示”文件或目录损坏且无法读取”上传图片网站速度超快的上传图片网站点心os什么是点心os?手机操作系统和手机区别么?一个是硬件一个是软件?听说炒的好火?什么是网络地址请问电脑显示正在获取网络地址是什么意思怎么办软件开发技术文档软件开发技术的目录病毒分析网站25个最恶意的病毒网站
yaokan永久域名经常更换 注册cn域名 外国空间 美国php主机 网站挂马检测工具 双11秒杀 91vps t云 彩虹云 游戏服务器出租 中国linux lamp的音标 阿里云手机官网 测速电信 测试网速命令 godaddy空间 apnic hostease 海外加速 godaddy中文 更多