objective-c中的@selector()和 c /c++的函数指针
先看tomcat里用到的代码:
//然后开始动画//把图片放到animationImages,接受数组参数self.tom.animationImages = arrayImage;//设置时间间隔,81张图,图多就播的时间稍微长,否则短self.tom.animationDuration = arrayImage.count * 0.074;//设置重复次数self.tom.animationRepeatCount = 1;//开始动画 [self.tom startAnimating];//结束动画,应该等等再清空[self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration];
最后一句代码,延迟加载 set 方法的过程。@selector(xxxx)的作用是找到名字为xxxx的方法。就是说去调用a对象的b方法,和[a b];的意思一样,但是这样更加动态一些。返回的类型是SEL,看方法说明的时候如果参数类型是SEL,那么就是要接受@selector(xxxx)返回的值。
回忆:
objective-c 语法快速过(5)中的SEL数据类型
每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL类型的数据就可以找到方法的地址,进而调用方法。SEL类型的定义:
typedef struct objc_selector *SEL;
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,其实发送的消息就是SEL。
具体这objc_selector结构体是什么,取决与使用GNU的还是Apple的运行时, 在Mac OS X中SEL其实被映射为一个C字符串,可以看作是方法的名字,它并不指向具体方法实现(IMP类型才是)。
对于所有的类,只要方法名是相同的,产生的selector都是一样的。
看官方文档;
- (id)performSelector:(SEL)aSelector
把指定的消息发送给接收方,饼返回执行的结果,也就是说 perform(本身就有履行执行的意思)Selector :xxx,是执行名字为 xxx 方法的方法,只不过是间接去执行,通过 sel 参数(使用@selector(方法的名字)的返回sel 类型),找到方法。
看到这里,发现@selector(methodName)非常类似 c 语言的函数指针的概念。
C语言中,可以把函数名直接赋给一个函数指针,而OC的类不能直接应用函数指针,这样只能做一个@selector语法来取.它的return结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)。
回忆函数指针:
函数也具有地址,指向函数的指针指向(保存)了函数代码起始处的地址,声明一个函数指针,必须先声明它指向的函数类型(返回类型和参量类型),声明指向函数的指针,函数指针可以作为另一个函数的参数,告诉第二个函数使用哪个函数。
void ToUpper(char *);//先声明函数 ……void (*p)(char *);//指针p是指向函数ToUpper的指针
即:(*p)也是一个函数,char*是它的参量,void是返回类型,表达式(*p)代替了函数名。因为*运算符优先级低于(),故必须加括号——(*p),省略掉圆括号意义就变了:
void * p(char *);//意思是p是一个函数,返回一个空指针类型
声明了函数指针,则可以用函数名表示函数的地址,当然指针也可以。函数指针最普遍的用法,是作为函数参数. 且只能指向函数都是相同类型的,可以用函数指针作为函数的参数,也能用函数名作为参数(函数名看作是函数地址),不能有函数数组!但是可以有函数指针的数组
再看 oc,取得selector值.
//object-c的选择器 @interface method -(int)add:(int) val; @endSEL fun ; //相当于定义一个方法指针 fun = @selector(add:);
注意;
可以用字符串来找方法
SEL 变量名 = NSSelectorFromString(方法名字的字符串);
可以运行中用SEL变量反向查出方法名字字符串
NSString *变量名 = NSStringFromSelector(SEL参数);
取得相应值后,怎么处理SEL值,这一点仍然与函数指针一样,就是执行它。SEL变量的执行,用performSelecor对象方法来执行.
[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
selector的应用场合
是能让Objective-C动态调用方法的玩意.
是 object-c 的动态后绑定技术
可以通过字符串访问函数
selector本质是跟C的回调函数一样。主要用于两个对象之间进行松耦合的通讯.这种方法基本上整个Cocoa库之间对象,控制之间通讯都是在这个基础构建的。
objective-c中的@selector()和 c /c++的函数指针相关推荐
- C++中函数指针数组的使用
C++中函数指针数组的使用 来源:电脑教程在线(http://www.linuxdiyf.com/1/) 作者:linux 原文:C++中函数指针数组的使用(http://www.linuxdiyf. ...
- C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)
接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...
- Android中的Selector的用法
Android中的Selector主要是用来改变ListView和Button控件的默认背景.其使用方法可以按一下步骤来设计: (以在mylist_view.xml为例) 1.创建mylist_vie ...
- Object-C 中的Selector 概念
selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念. @selector(xxxx)的作用是找到名字为xxxx的方法.一般用于[a pe ...
- epoll 浅析以及 nio 中的 Selector
转载自 epoll 浅析以及 nio 中的 Selector 首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference): 首先我们来定义流的概念, ...
- epoll浅析以及nio中的Selector
出处: https://my.oschina.net/hosee/blog/730598 首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference) ...
- 【IOS】Object-C 中的Selector 概念
在iphone程序中会大量看到@selector这样的用法.<<iphone开发基础>花了很大一个篇幅来解析这个语法,但是不知是翻译问题,还是解释过细,不大看得懂,很是不给力.直到程 ...
- activemq中的selector
activemq中的selector Producer.java Consumer.java activemq消息中间件可以过滤消息,也就是selector,selector遵循sql 92语法.可以 ...
- Objective-C中,ARC下的 strong和weak指针原理解释
Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...
最新文章
- 三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)
- 又一道软通动力7K月薪面试题——银行业务调度系统
- 《系统集成项目管理工程师》必背100个知识点-32工作分解结构步骤
- 【字符串系列】字符串匹配中的位并行算法
- android数据绑定_Android数据绑定
- ios 给网页传值_ios常见的页面传值方式
- SQL Sever 2012学习总结之使用SQL语言创建数据库与表
- 15个数据可视化的绝妙案例
- 堆叠柱状图显示具体数据和百分比
- C++病毒-----------混乱鼠标
- 移动魔百盒CM311-3-YST-晨星MSO9385-语音首页正常-TTL刷机包
- 深入探索Android布局优化(上)
- 【书摘】深度学习简史(摘抄自《深度学习基础与应用》)
- 平安好医生发布半年报,“关键先生”方蔚豪寻求变阵|看财报
- JS之FormData对象
- ChinaRAP中国道路(路网)风险评估系统研究与应用
- 几种光纤接口(ST,SC,LC,FC)
- I - Keylogger Gym - 101078I——模拟队列+栈
- 计算机毕业设计asp.net的大学生交友网站(源码+系统+mysql数据库+Lw文档)
- Android开发丶基于mupdf在Android设备上横竖屏查阅pdf文件