OC学习:SEL类型数据和selector的用法
2015-05-20 17:03
330 查看
Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。
SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
注意:
这个过程是有缓存的,第一次找SEL对应的方法是逐条找,比较耗性能,但是找过一次之后,便会留下缓存数据,再找就直接访问缓存了。
例如,声明方法:
实现后,像如下一样直接调用:
同样调用test3可以这样:
或:
这样,我们就可以通过一个方法名字符串来调用此方法:
其实每个方法内部都有一个_cmd变量,其是SEL类型变量,代表当前方法。
上面的打印语句就是将当前的方法名打印出来,这里的_cmd其实就相当于@selector(test2)。
所以,其实消息就是SEL。
一、SEL
每个SEL类型数据都是一个方法。SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
注意:
这个过程是有缓存的,第一次找SEL对应的方法是逐条找,比较耗性能,但是找过一次之后,便会留下缓存数据,再找就直接访问缓存了。
例如,声明方法:
@interface Person : NSObject + (void)test1; - (void)test2; - (void)test3:(NSString *)abc; @end
实现后,像如下一样直接调用:
Person *person = [[Person alloc] init]; [p test1];
二、selector
上例中,也可这样利用selector来间接调用:[p performSelector: @selector(test2)];
同样调用test3可以这样:
[p test3: @"123"];
或:
[p performSelector:@selector(test3:) withObject:@"123"];
这样,我们就可以通过一个方法名字符串来调用此方法:
NSString *name = @"test2"; SEL s = NSSelectorFromString(name); [p performSelector:s];
其实每个方法内部都有一个_cmd变量,其是SEL类型变量,代表当前方法。
NSString *str = NSStringFromSelector(_cmd); NSLog(@"%@",str);
上面的打印语句就是将当前的方法名打印出来,这里的_cmd其实就相当于@selector(test2)。
所以,其实消息就是SEL。
相关文章推荐
- OC基础:OC 基本数据类型与对象之间的转换方法 分类: ios学习 OC 2015-06-18 20:01 11人阅读 评论(0) 收藏
- 小白学开发(iOS)OC_ SEL数据类型(2015-08-10)
- java学习-JAVA基本排序法示例,JAVA数据类型转换 ,ArrayList用法,Calendar 简单应用
- OC学习总结之数据类型
- 【IOS 开发学习总结-OC-2】objective-c 数据类型
- 小白学开发(iOS)OC_ SEL数据类型(2015-08-10)
- OC基础学习——SEL(选择器类型)和Class的学习
- Java之学习笔记(12)-----------数据类型转换valueOf、subString、indexOf用法
- Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符
- object - c 学习之:oc里面常用的基本数据类型和限定词
- 黑马程序员_iOS开发之OC之面向对象之id语法、构造方法、@category分类、类本质、description方法和SEL数据类型
- 学习笔记:OC的数据类型 block 使用
- OC基础学习——基本数据类型和复杂数据类型
- OC学习笔记SEL类型初步理解
- ios学习第一天(二)oc基本数据类型
- 【OC加强】SEL数据类型的简单知识点——和方法有关
- OC学习心得之数据类型
- OC学习1——基本数据类型
- 【OC学习-2】OC里面的数据类型
- OC数据类型学习