selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念。
@selector(xxxx)的作用是找到名字为xxxx的方法。一般用于[a performSelector:@selector(b)];就是说去调用a对象的b方法,和[a b];的意思一样,但是这样更加动态一些。@selector(xxxx)返回的类型是SEL,看方法说明的时候如果参数类型是SEL,那么就是要接受@selector(xxxx)返回的值的那种了。
在Objc中 SEL的定义是:
- 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库之间对象,控制之间通讯都是在这个基础构建的。
分享到:
相关推荐
robot-cases-selector-plugin插件,使用指南请查看另一篇博客
postcss前缀选择器 使用自定义命名空间.a => .prefix .a每个CSS选择器添加前缀。 目录 安装 $ npm install postcss-prefix-... exclude : [ '.c' ] , // Optional transform callback for case-by-case overrid
Android-Ultra-Photo-Selector是一个多图片选择的开源框架,可以实现多图片的选择
Laravel开发-laravel-lang-selector Laravel创建智能多语言网站
嵌入式UI组件,可轻松选择iOS上的备用图标。 为什么? 将替代图标添加到iOS应用程序并不完全简单,但应该做到。 将条目添加到Info.plist中非常棘手,更不用说实现可以在iPhone和iPad上显示的UI了。 该库负责最后一...
videojs-max-quality-selector Videojs插件可帮助您列出实时,自适应和渐进流中的分辨率和比特率。目录 minHeight :number showBitrates :boolean showSingleItemMenu :boolean 排序:number sortEnabled :boolean ...
Android Multiple Images Selector Easy-to-use library to select images in Android application Features: select images by folders support to set max number of images to be selected allow filter images ...
插件将根选择器添加到所有其他规则中。 输入: . foo { color : red; } a . foo , section { color : red; } @media ( max-width : 700 px ) { # some-id { color : red; } } /* ...
npm i -D typed-query-selector :watermelon: 用法 自动补片 您需要做的就是导入此模块,然后将增强querySelector和querySelectorAll函数。 该模块仅适用于类型级别,并且没有任何运行时代码。 import 'typed-...
关于XML绘图(bitmap ,shape ,layer-list ,selector ,animation)的demo
前端开源库-stylelint-selector-bem-patternStylelint选择器BEM Pattern,一个利用PostSS BEM Linter功能的Stylelint插件
React本机表情符号选择器安装npm install --save react-native-emoji-selectorimport EmojiSelector from 'react-native-emoji-selector'演示版用法基本用法< EmojiSelector xss=removed xss=removed> console ....
"Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } --- apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: kube-flannel-ds-amd64 namespace: kube-system labels: tier: node...
本书简明概要的介绍的object-c的特点。 例子具有代表性。 目录列表如下: 第 1 章,也就是本章 第 2 章,从 Hello,World!开始 第 3 章,类的声明和定义 第 4 章,继承 第 5 章,Class 类型,选择器 Selector 以及...
当前,React中没有使用钩子来订阅部分上下文的本地方法。 这意味着更改上下文的一小部分,可能会导致重新渲染使用上下文的每个组件。 出于相同的目的,还存在另一个包 ,但它不再允许您使用常规的Consumer ,并且它...
前端开源库-css-selector-extractCSS选择器提取,从CSS代码中提取特定的CSS选择器
React + Emoji电话国家/地区代码选择器 ... 在您的代码中,像这样导入组件: import { HtmlEmojiCountryCodeSelector } from "react-emoji-country-code-selector" ; 或者如果您的项目不支持ES6
前端开源库-has-id-selector有ID选择器,检查CSS选择器字符串是否有ID。
**使用sk-php-selector2.sh,在此您可以选择安装什么php版本sk-php-selector3.sh与sk-php-selector2.sh相同,但具有简化的代码,现在正在测试中** 因此,您只能选择一个运行它的版本: bash sk-...
grunt-css-selector-limit Grunt插件,用于检测集合中的任何CSS文件是否具有比IE的4095限制更多的选择器。包装。入门这个插件需要~0.4.2 如果您以前从未使用过 ,请务必查看《指南》,因为它说明了如何创建以及安装...