【转】selector函数指针回调机制

selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念。
[self performSelector:@selector(Hidden) withObject:nil afterDelay:2.8];//2.8秒之后调用selector里面的函数,很好用

@selector(xxxx)的作用是找到名字为xxxx的方法。一般用于[a performSelector:@selector(b)];就是说去调用a对象的b方法,和[a b];的意思一样,但是这样更加动态一些。@selector(xxxx)返回的类型是SEL,看方法说明的时候如果参数类型是SEL,那么就是要接受@selector(xxxx)返回的值的那种了。
在Objc中 SEL的定义是:
  1. typedef struct objc_selector *SEL;
具体这objc_selector结构体是什么取决与使用GNU的还是Apple的运行时, 在Mac OS X中SEL其实被映射为一个C字符串,可以看作是方法的名字,它并不一个指向具体方法实现(IMP类型才是)。对于所有的类,只要方法名是相同的,产生的selector都是一样的。
在iphone程序中会大量看到@selector这样的用法。<<iphone开发基础>花了很大一个篇幅来解析这个语法,但是不知是翻译问题,还是解释过细,不大看得懂,很是不给力.直到程序用这个语法,并且仔细看了一些解析文章。才明白这一语法。
简而言之,你可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
 
它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)?因此我们有如下代码。
 
一.取得selector值.
 
C函数指针

int add(int val)
{
return val+1;
}


int (* c_func)(int val);
//定义一个函数指针变量

c_func = add ;
//把函数addr地址直接赋给c_func

int add(int val)
{
return val+1;
}


int (* c_func)(int val);
//定义一个函数指针变量

c_func = add ; //把函数addr地址直接赋给c_func

 
object-c的选择器,

@interface foo
-(int)add:int val;
@end


SEL class_func ;
//定义一个类方法指针

class_func = @selector(add:int);

@interface foo
-(int)add:int val;
@end


SEL class_func ;
//定义一个类方法指针

class_func = @selector(add:int);

注意1. @selector是查找当前类的方法,而[object @selector(方法名:方法参数..) ] ;是取object对应类的相庆方法.
注意2.查找类方法时,除了方法名,方法参数也查询条件之一.
注意3. 可以用字符串来找方法 SEL 变量名 = NSSelectorFromString(方法名字的字符串);
注意4. 可以运行中用SEL变量反向查出方法名字字符串
NSString *变量名 = NSStringFromSelector(SEL参数);
二.执行selector值.
取得相庆值后,怎么处理SEL值呢,这一点仍然与函数指针一样,就是执行它
函数指针执行,(以下有几种等效形式)
*c_func(10);
c_func(10);
 
 
SEL变量的执行.用performSelecor方法来执行.
[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
 
三.selector的应用场合
selector本质是跟C的回调函数一样。主要用于两个对象之间进行松耦合的通讯.这种方法很多开发环境用到。比如GTK,Delphi.基本上整个Cocoa库之间对象,控制之间通讯都是在这个基础构建的。

转载于:https://www.cnblogs.com/wengzilin/archive/2012/05/04/2482652.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8 种有趣的用于 Web 品牌的动物

当 Mozilla 推出最新移动浏览器 Fennec 时&#xff0c;很多人需要借助 Wikipedia 才知道 Fennec 是什么意思&#xff0c;Web 2.0 产品以各种古怪的命名著称&#xff0c;要么非常拗口&#xff0c;象 Flickr&#xff0c;要么很 cute&#xff0c;象 Google&#xff0c;或者干脆不知…

注解使用案例

一、一个简易测试框架&#xff1a; 1、定义Check注解&#xff0c;无需添加属性 2、需要测试的类&#xff0c;添加Check注解 3、测试框架代码&#xff1a; for循环上创建一个文件输出流对象&#xff0c;记录方法测试记录&#xff1a; 捕捉异常&#xff1a; 其中&#xff0c;get…

Java Date Time 教程-时间测量

为什么80%的码农都做不了架构师&#xff1f;>>> 在Java中&#xff0c;用System.currentTimeMillis()来测量时间最方便。你要做的是在某些操作之前获取到时间&#xff0c;然后在这些操作之后你想要测量时间&#xff0c;算出时间差。下面是一个例子&#xff1a; 1lon…

Java -- 网络编程(一):Client与Server之间的数据传送

目前对于我这种刚接触网络编程的豆芽来说&#xff0c;对网络编程最直观的了解就是&#xff1a;一些的Client和一个Server端之间的数据传递。具体当然是复杂的&#xff0c;但是那是我以后要学的。 今天我知道了可以通过Socket和DatagramSocket两种套接字来进行Client和Server的链…

企业使用RTX腾讯通2013

2019独角兽企业重金招聘Python工程师标准>>> 腾讯通基本上成为了公司的默认配置&#xff0c;确实缺不了&#xff0c;这里记录一篇配置RTX&#xff0c;包括服务端和客户端。 1.客户端的使用 1.1 一般使用人员不需要关心任何事&#xff0c;只需要登录管理员分配给你的…

C++ Primer 第六章 语句

本章内容比较简单&#xff0c;不作过多说明。如果学习过任意一门编程语言可以跳过本章。 转载于:https://www.cnblogs.com/kingcat/archive/2012/05/07/2487764.html

表达式求解

表达式求解问题 第四次数据结构实验&#xff1a; 实验三&#xff1a;表达式求值 实验目的&#xff1a; 1、掌握顺序栈结点类型的定义 2、掌握栈的插入和删除结点操作的特点&#xff1b; 3、熟悉对栈的一些基本操作和具体的函数定义。 代码&#xff1a; 1 /*Status.h 各种常量状…

date()

$ttime(); echo date("Y-m-d H:i:s",$t); 第一个参数的格式分别表示: a - "am" 或是 "pm" A - "AM" 或是 "PM" d - 几日&#xff0c;二位数字&#xff0c;若不足二位则前面补零; 如: "01" 至 "31" D -…

Absolute C++ Chapter 3 Self-Test Exercise(3)

15. Hello Goodbye One more time Hello End of program 16. It will occur an error only there is 0 person to divide to ice-cream. 17. #include<iostream> using namespace std; void product(int num1,int num2,int num3); int main() {  cout<<"Gi…

棍子节快乐~ 顺便转一篇weka源码分析解析~【转自weka中文网】

经常看到有人问&#xff0c;我想修改Weka里面的算法&#xff0c;我想把Weka的算法加到我自己的程序里面去&#xff0c;但是我该从哪里着手呢&#xff1f;于是&#xff0c;这篇帖子就有必要出现了。但是&#xff0c;这个题目太大了&#xff0c;Weka里面有那么多代码呢&#xff0…

Android中弹出对话框,AlertDialog关键代码

写在这里便于以后查看。 Android中弹出对话框的关键代码&#xff1a; 1 btn01.setOnClickListener(new OnClickListener() {2 3 Override4 public void onClick(View v) {5 Toast.makeText(musicActivity.this, "tanchu", 1…

poj 2226 Muddy Fields 最小顶点覆盖

题目链接&#xff1a;http://poj.org/problem?id2226 这道题跟上一道很相似不同之处在于这里不是整行或者整列的删&#xff0c;而是连续的几个可以一起删&#xff0c;不连的不能删&#xff0c;这就要对原图进行处理&#xff0c;对原有的图行由上到下&#xff0c;列由左到右进行…

python抓取网站URL小工具

1、安装Python requests模块&#xff08;通过pip&#xff09;&#xff1a; 环境搭建好了&#xff01; 2、测试一下抓取URL的过程&#xff1a; 抓取出来的URL有JavaScript代码&#xff0c;正则上还有待更加完善&#xff0c;有兴趣的可以研究下~&#xff01; 工具源代码: #coding…

二叉树特性及详细例子

二叉树的性质 一般二叉树性质&#xff1a; 在非空二叉树的k层上&#xff0c;至多有2k个节点(k>0)高度为k的二叉树中,最多有2k1-1个节点(k>0)对于任何一棵非空的二叉树,如果叶节点个数为n0&#xff0c;度数为2的节点个数为n2&#xff0c;则有: n0 n2 1完全二叉树性质:只…

C#抽象类与接口的比较

相同点 ●都不能被直接实例化&#xff0c;都可以通过继承实现其抽象方法。 ●都是面向抽象编程的技术基础&#xff0c;实现了诸多的设计模式。 不同点 ●接口支持多继承&#xff1b;抽象类不能实现多继承。 ●接口只能定义抽象规则&#xff1b;抽象类既可以定义规则&#xff0c…

创建 Spring容器的三种方式

一、src路径下打包完在war包的classes层级下 1、Spring容器创建的三种方式 创建Bean容器之后创建对象&#xff1a; 其中第三种使用的是BeanFactory对象 2、spring通过配置文件用容器创建对象的原理 转载于:https://www.cnblogs.com/wmqiang/p/11537638.html

OpenSSL以及私有CA的搭建

首先我们肯定会问什么是OpneSSL,以及OpenSSL有什么用&#xff1f;当让这不仅是刚接触Linux的我想知道&#xff0c;相信大多数人和我一样也非常想知道&#xff0c;因为OpenSSL是linux上基础的服务之一&#xff0c;了解它的应用可以帮助我们更好的了解linux。那么我们先了解下什么…

重新修复安装.netframework2.0

有时候由于各种原因&#xff0c;导致.net组件失效&#xff0c;不防试试修复一下: CMD里运行: C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -u C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i转载于:https://www.cnblogs.com/comcy…

电话骗术升级了,提高警惕! (转自公司内部新闻组,真人真事)

事情经过: 今天早上家里的座机接到10000号打来的欠费电话,电脑语音提示欠费2600多元,然后我就很惊讶,挂断后就打10000号查询(手动拨号,并不是回拨的).一切都跟平常打10000号一样的语音提示,一步步操作,最后转到人工台,查询结果是欠费2600多,我说不可能,平常打电话都是用手机居多…

yii使用寻呼功能

CDbCriteria这是类包使用&#xff0c;包是yii自带专门用来处理类似分类这种功能的。而我们使用yii框架然后调用这种方法会起到事半功倍的效果&#xff0c;会发现使用这个可以节省非常多的时间。让你高速的使用PHP中分页的功能。 还要使用的一个类包就是CPagination&#xff0c;…