OC中的SEL对象即selector对象,用来保存一个方法的地址。下面通过一个Demo来解析SEL的原理。创建一个Person类,Person.h中:

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int age;
@protected
    float height;
}

@property int age; // 编译器自动解释成 int age的get/set方法

- (void)say;
- (void)testSEL;
@end

Person.m中:

#import "Person.h"

@implementation Person
@synthesize age; //编译器自动解释成 age的get、set方法实现

- (void)say
{
    NSLog(@"调用了say方法");
}

- (void)testSEL
{
    SEL say1 = @selector(say); // 创建say方法的SEL对象
    SEL say2 = NSSelectorFromString(@"say"); // 从方法名字符串 创建SEL对象
    [self performSelector:say1]; // 执行say1指向的方法
    [self performSelector:say2]; // 执行say2指向的方法

    /*
     以下可以作为Log输出
     */
    NSLog(@"------------------------------------------------");
    SEL s = _cmd; // 每一个方法内都有一个_cmd,表示方法自身
    NSLog(@"当前方法(NSStringFromSelector):%@", NSStringFromSelector(s)); // NSStringFromSelector 返回方法名
    NSLog(@"所在文件完整路径(__FILE__):%s", __FILE__);
    NSLog(@"所在文件名:%@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent]);
    NSLog(@"当前行号(__LINE__):%d", __LINE__);
    NSLog(@"当前方法签名(__func__):%s", __func__);
    NSLog(@"当前方法签名(__PRETTY_FUNCTION__):%s", __PRETTY_FUNCTION__); // 在c++代码中,会包含类型的详细信息
    NSString *clz = NSStringFromClass([Person class]); // 返回一个Class对象的类名
    NSLog(@"当前类名(NSStringFromClass):%@", clz);

    NSLog(@"%@", [NSThread callStackSymbols]); // 返回当前调用栈信息
}
@end

main.m中:

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [[Person new] testSEL];
    }
    return 0;
}

结果为:

2016-05-28 19:20:57.384 SELDemo[3657:25679] 调用了say方法
2016-05-28 19:20:57.384 SELDemo[3657:25679] 调用了say方法
2016-05-28 19:20:57.384 SELDemo[3657:25679] ------------------------------------------------
2016-05-28 19:20:57.384 SELDemo[3657:25679] 当前方法(NSStringFromSelector):testSEL
2016-05-28 19:20:57.385 SELDemo[3657:25679] 所在文件完整路径(__FILE__):/Users/lile/Desktop/SELDemo/SELDemo/Person.m
2016-05-28 19:20:57.385 SELDemo[3657:25679] 所在文件名:Person.m
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前行号(__LINE__):34
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前方法签名(__func__):-[Person testSEL]
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前方法签名(__PRETTY_FUNCTION__):-[Person testSEL]
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前类名(NSStringFromClass):Person
2016-05-28 19:20:57.385 SELDemo[3657:25679] (
    0   SELDemo                             0x0000000100001ba6 -[Person testSEL] + 502
    1   SELDemo                             0x0000000100001c7e main + 78
    2   libdyld.dylib                       0x00007fff9f3055ad start + 1
)

OC中的SEL解析的更多相关文章

  1. QF——OC中的SEL类型和Block

    @selector(): 可以理解@selector()就是取类方法的编号,他的基本行为类似于C语言中的函数指针(指向函数的指针).它们通过传递方法的地址(或编号)来实现把方法当做参数的效果. 不过在 ...

  2. OC中SEL,类别,继承,协议的使用

    1.SEL SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法.我们在后面的UI中会经常用selector来调用事件方法.下面我将举两个例子来说明 ...

  3. OC中Runtime浅析

    近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...

  4. [BS-21] 关于OC中对象与指针的思考

    关于OC中对象与指针的思考 1. 创建对象: OC中可通过代码Person *p = [[Person alloc] init];创建了一个对象p.该过程中内存情况为: 在当前线程的栈(默认1M)中, ...

  5. 关于 self 和 super 在oc 中 的疑惑 与 分析

    关于 self 和 super 在oc 中 的疑惑 与 分析   面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写 代码,网上那么多资料.  区分高低也就是研究的深度和广度 ...

  6. iOS开发中的Html解析方法

    iOS开发中的Html解析方法 本文作者为大家介绍了在iOS开发中的Html解析方法,并同时提供了Demo代码的下载链接,Demo 解析了某个网站(具体可在代码中查看)的html网页,提取了图片以及标 ...

  7. oc中的反射机制

    好久没有总结过了,一直在赶项目... 今天来总结一下OC中的反射机制,有什么不对的地方,还请多多海涵. 反射机制,简单的说就是在程序运行期间通过类的名字来动态的获取类的信息,从而实现动态的创建类,以及 ...

  8. 关于void*类型的用法(相当于OC中的id类型)

    关于void*类型的用法(相当于OC中的id类型) 1.C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*.float*甚至抽象数据类型的指 ...

  9. OC 中 self 与 super 总结

    一段代码引发的思考: @implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"% ...

随机推荐

  1. VC和VS调用Lua设置以及Lua C API使用。

    通过c++调用lua 脚本,    环境VC++6.0    lua  sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...

  2. Android基础之响应Menu键弹出菜单Demo

    对于Android我也不是很熟悉,只是学习一些基本内容就OK.所以写的内容也很简单.本Demo要实现的效果就点击Menu键将弹出一个菜单并响应点击菜单项事件. 一.废话少说直接上代码.其实就是重写两个 ...

  3. 接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。

    [2015/8/5 19:28:49]错误信息:接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定 ...

  4. bzoj1455

    学习了一下可合并堆的一种写法——左偏树感觉左偏树是一种类似启发式的方法学习左偏树后这题就水过去了 ..] of longint; v:..] of boolean; i,n,m,x,y,f:longi ...

  5. NOIP2014酱油记

    尘埃落定,来补一下酱油记吧... day-1 晚上老师说有xyz的noip模拟赛,于是果断请假来做(shou)题(nve),题目真是理(S)性(X)愉(B)悦(K),然后就爆零了!感觉noip要爆零滚 ...

  6. 【转】Eclipse使用git最简易流程

    原文网址:http://www.cnblogs.com/ZhangWanFan/p/3993733.html git有诸多好处,网上都说的很清楚了,在这里我不再赘述.对于我来说,私下里想做一些项目,而 ...

  7. 转---在ASP.NET MVC中实现登录后回到原先的界面

    有这样的一个需求:提交表单,如果用户没有登录,就跳转到登录页,登录后,跳转到原先表单提交这个页面,而且需要保持提交表单界面的数据. 提交表单的页面是一个强类型视图页,如果不考虑需要保持提交表单界面的数 ...

  8. Hdu 5036-Explosion 传递闭包,bitset,期望/概率

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5036 Explosion Time Limit: 6000/3000 MS (Java/Others)   ...

  9. MIPI D-PHY 总结

    Operating Modes: Control, High-Speed, and Escape 1.The Lane is only in High-Speed mode during Data b ...

  10. svn操作

    1.已经被svn管理的文件的复制.删除.重命名都要通过svn的命令来操作(在资源管理器中通过鼠标右键来完成)(复制粘贴可以通过右键按下移动来实现) 2.没有被svn管理的文件(没有被上传过的文件,没有 ...