objective-c中的@selector()和 c /c++的函数指针

时间:2022-09-24 22:34:16

先看tomcat里用到的代码:

    //然后开始动画
//把图片放到animationImages,接受数组参数
self.tom.animationImages = arrayImage;
//设置时间间隔,81张图,图多就播的时间稍微长,否则短
self.tom.animationDuration = arrayImage.count * 0.074;
//设置重复次数
self.tom.animationRepeatCount = ;
//开始动画
[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;
@end SEL 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库之间对象,控制之间通讯都是在这个基础构建的。

欢迎关注

dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!

objective-c中的@selector()和 c /c++的函数指针

objective-c中的@selector()和 c /c++的函数指针的更多相关文章

  1. 关于oc中出现的typedef的用法/定义函数指针

    typedef int (^calculateBlock)(int a,int b); 这里面typedef的作用只是给 calculateBlock取了一个 别名,说明以后可以直接使用. calcu ...

  2. 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)

    为了调试LCD,在英倍特的板子上烧Atmel的sam3s-ek_demo_1.4_source示例代码.LCD显示正常了,却找不到LCD的驱动究竟在哪. 花了好久,追踪到了这个执行过程. 进入main ...

  3. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  4. Objective C SEl 和@selector是怎么工作的||How do SEL and @selector work in iphone sdk?

    SEL is a type that represents a selector in Objective-C. The @selector() keyword returns a SEL that ...

  5. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  6. Android中的Selector的用法

    转自: Android中的Selector主要是用来改变ListView和Button控件的默认背景.其使用方法可以按一下步骤来设计: (以在mylist_view.xml为例) 1.创建mylist ...

  7. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  8. NSObject 中执行Selector 的相关方法

    1. 对当前Run Loop中Selector Sources的取消 NSObject中的performSelector:withObject:afterDelay:方法将会在当前线程的Run Loo ...

  9. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

随机推荐

  1. 自动ftp上传文件脚本

    方法一: echo "open 21.244.88.129 user glxtftp glbzuser bin prompt off cd /glxt/DBINFO lcd /tmp put ...

  2. CSS基础知识真难啊-font

    不吐不快啊!!!! 上午测试还好好的,下午再写一次准备发出来就出错了!! 传说中程序媛三大错觉:我肯定没错,刚才还好好的,一定是有人改了我代码.. 我的口头禅都快变成“刚刚还好好的”了! 事情是这样的 ...

  3. .NET中资料库的设计与SQL

    .NET中资料库的设计与SQL ADO.NET设计 先来说说资料库的设计 主要涉及 关联式资料库 资料库系统管理(DBMS) 结构化查询(SQL) 预储程序 一个资料库包含一个以上的资料表,每个资料表 ...

  4. XMPP Server

    XMPPFramework,编译失败,@import libxmlSimu后提示:Module 'libxmlSimu' not found XMPP协议实现原理介绍 XMPP协议学习笔记 四.地址格 ...

  5. [saiku] JCR在saiku中的运用原理

    转载自: 什么是JAVA内容仓库(Java Content Repository)(1) 什么是JAVA内容仓库(Java Content Repository)(2) 什么是JAVA内容仓库(Jav ...

  6. 学习笔记——解释器模式Interpreter

    解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...

  7. 【推荐】免费,19 款仿 Bootstrap 后台管理主题下载

    声明: 1. 本篇文章提到的仿 Bootstrap 风格的主题,是基于 jQuery 的 ASP.NET MVC 控件库的主题. 2. FineUIMvc(基础版)完全免费,可以用于商业项目. 目录 ...

  8. Nginx学习系列三Nginx的启动、停止、修改配置文件后重启

    1.启动Nginx 命令规则:Ngxin的安装地址 -c Nginx的安装地址下的配置文件地址 注意:一般都在root权限下进行Nginx的启动 2.停止Nginx (1).从容停止 第一步:查看Ng ...

  9. 在H5页面内通过地址调起高德地图实现导航

    项目中用到的一个功能是要通过点击地址来实现打开地图app实现地址导航. 如下图: 实现思路就是在H5页面内通过点击marker图标然后进行当前位置与页面上地址的路程规划与导航. 由于项目中用到的是高德 ...

  10. 【Java】JVM(五)、虚拟机类加载机制

    一.概念 类加载:虚拟机把类的数据从Class文件加载到内存中,并对数据进行校验,转化解析,和初始化,最终形成可以被虚拟机直接使用的Java类型. 二.加载时机 1.加载 加载阶段虚拟机完成的工作为: ...