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. SQLite: sqlite_master

    SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引.每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据库的 ...

  2. Oracle RAC的五大优势及其劣势

    Oracle RAC的五大优势及其劣势 不同的集群产品都有自己的特点,RAC的特点包括如下几点: 双机并行.RAC是一种并行模式,并不是传统的主备模式.也就是说,RAC集群的所有成员都可以同时接收客户 ...

  3. Maven学习(1) - Maven入门

    home index:http://maven.apache.org/ download:http://maven.apache.org/download.cgi install: http://ma ...

  4. Unity3D屠龙战机项目总结

    之前跟着老师后面边学边做了一个屠龙战机项目,在这个项目中,主要用到的技术,在这里总结一下(本次项目的脚本语言用的是JS): 1.  如果想在场景中导入一个声音文件,则需要在脚本中添加一个变量,如在脚本 ...

  5. shadowgun的飘扬旗帜shader

    MADFINGER-Lightmap-Unlit-Wind用于模拟布料和树被风吹的弯曲摆动效果 这个来自于<GPU GEMS 3>中的 “Chapter 16 Vegetation Pro ...

  6. ORACLE EXP-00011:表不存在的分析和解决方案

    解决方法: ~~看下数据库的延迟段创建参数 SQL> show parameter DEFERRED_SEGMENT_CREATION NAME                          ...

  7. C#中同时使用Lambda表达式和递归

    Func<object, int> RTFunc = (RTFuncRT) => { return (RTFuncRT as Func<object, int>)(RTF ...

  8. 南京Uber优步司机奖励政策(1月25日~1月31日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. winform 跨窗体给控件传值 分类: WinForm 2014-08-02 16:33 195人阅读 评论(0) 收藏

    两个窗体 FormA,FormB; FormA窗体中有一文本框控件:TextBox; FormB窗体中有一变量:txtJSJ 目的:把变量赋值给文本框 实现: 设置TextBox属性: Modifie ...

  10. Color Cube – 国产的优秀配色取色工具

    官方下载地址:http://fancynode.dbankcloud.com/ColorCube2.0.1ForWin.rar 比如今天所要介绍的 Color Cube (配色神器) 就属于“功大于过 ...