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. jQuery动态五星评分

    效果 css .star ul, .star li { list-style: none; } .star { position: relative; width: 600px; height: 24 ...

  2. luoguP2265 路边的水沟

    题目:http://www.luogu.org/problem/show?pid=2265 题解:ans=C(n+m,n)%p 求一下逆元就行 代码: #include<cstdio> # ...

  3. (转载)不能启动虚拟机 Unable to open kernel device "\\.\Global\vmx86

    (转载)http://blog.csdn.net/shenghuiping2001/article/details/7083153 今天系统加了内存条,设置变了一下: 就启动不起虚拟机了,报错: Un ...

  4. yarn安装部署

    在HDFS HA(http://www.cnblogs.com/yinchengzhe/p/5140117.html)基础上进行yarn的安装. 1.配置yarn-site.xml 参数详情参考 ht ...

  5. 使用QJM部署HDFS HA集群

    一.所需软件 1. JDK版本 下载地址:http://www.oracle.com/technetwork/java/javase/index.html 版本: jdk-7u79-linux-x64 ...

  6. UVA 11427 Expect the Expected(DP+概率)

    链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396 [思路] DP+概率 见白书. [代码] #include&l ...

  7. vijosP1195“非常男女”计划

    vijosP1195“非常男女”计划 链接:https://vijos.org/p/1195 [思路] 人数差. 人数差相等的两点之间的区间一定有男女人数相等. 计目前为止到i的1为sum1,0为su ...

  8. Java获取当前路径

    1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...

  9. mipi 调试经验

    转载自http://blog.csdn.net/g_salamander/article/details/9163455 以下是最近几个月在调试 MIPI DSI / CSI 的一些经验总结,因为协议 ...

  10. OFFSET & FETCH

    OFFSET & FECTH 关键字与ORDER BY结合使用,实现对查询结果的分页 一.单独使用OFFSET: 示例:查询所有职员的信息,按雇佣日期排序并跳过前285条记录(共290条) U ...