SEL

SEL对应方法的地址

_cmd代表当前方法

1.  方法的存储位置

  • 每个类的方法列表都存储在类对象中
  • 每个方法都有一个与之对应的SEL类型的对象
  • 根据一个SEL对象就可以找到方法的地址,进而调用方法
  • SEL类型的定义

typedefstructobjc_selector  *SEL;

2.  SEL对象的创建

SEL s = @selector(test);

SEL s2 = NSSelector FromString(@"test");

3. SEL对象的其他用法

// 将SEL对象转为NSString对象

NSString *str = NSStringFromSelector(@selector(test));

Person *p = [Personnew];

// 调用对象p的test方法

[p performSelector:@selector(test)];

/*
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法 其实消息就是SEL
*/ #import <Foundation/Foundation.h>
#import "Person.h" int main()
{
Person *p = [[Person alloc] init];//+test和-test。。。。有SEL s1、s2分别对应 //直接调用
[p test2]; // NSString *name = @"test2";
//
// SEL s = NSSelectorFromString(name);
//
// [p performSelector:s]; // 间接调用test2方法
//[p performSelector:@selector(test2)]; //[p test3:@"123"]; //第三种调用方法:
// SEL s = @selector(test3:);
//
// [p performSelector:s withObject:@"456"]; //第一种直接调用方法: [p test2];
// 1.把test2包装成SEL类型的数据
// 2.根据SEL数据找到对应的方法地址
// 3.根据方法地址调用对应的方法
return ;
}

NSLog输出增强

  • __FILE__ :源代码文件名
  • __LINE__ :NSLog代码在第几行
  • _cmd :代表着当前方法的SEL

// 下面的代码会引发死循环

- (void)test{

[self performSelector:_cmd];

}

OC-SEL的更多相关文章

  1. OC SEL (@selector) 原理及使用总结(转)

    SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应 ...

  2. OC语言description方法和sel

    OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ...

  3. 李洪强iOS开发之OC语言description方法和sel

    OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ...

  4. OC中的SEL解析

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

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

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

  6. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

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

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

  8. oc语言--description方法和sel

    一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象方法) 使用NSLog和@%输出某个对象时, ...

  9. 「OC」类的深入研究、description方法和sel

    一.类的深入研究 (一)类的本质 类本身也是一个对象,是class类型的对象,简称“类对象”. Class类型的定义: Typedef struct obj class *class; 类名就代表着类 ...

  10. OC description和sel

    一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象方法) 使用NSLog和@%输出某个对象时, ...

随机推荐

  1. js-处理金额(正则表达式)

    function checkRates(str){ var re = /^(([1-9][0-9]*\.[0-9][0-9]*)|([0]\.[0-9][0-9]*)|([1-9][0-9]*)|([ ...

  2. SurfaceView, TextureView, SurfaceTexture等的区别

    SurfaceView, GLSurfaceView, SurfaceTexture以及TextureView是Android当中名字比较绕,关系又比较密切的几个类.本文基于Android 5.0(L ...

  3. C#-面向对象的三大特性——封装(封装成员变量、封装成员方法)

    封装: 封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型. 封装的意义在于保护或者防止代码(数据)被我们无意中破坏. 封装既可以封装成员变量,又可以封装成 ...

  4. 如何更新firefox中的flash

    要了解当前安装的版本是否为最新版本,请访问 插件检查页面http://www.mozilla.com/plugincheck/  ,如果该页面告诉你 Flash 插件需要更新,请手动安装最新版本. 使 ...

  5. Eclipse中使用SVN

    1.在Eclipse里下载Subclipse插件   方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Ma ...

  6. 使用redis作为session的存储方式

    (1)准备 A. 安装好redis https://github.com/MSOpenTech/redis  注意:下载release版 启动脚本如下: redis-server  redis.win ...

  7. python 内建类型

    ''' 数值 numbers 字符串 strings 列表 lists 字典 dictionaries 元组 tuples 文件 files 集合 sets ''' 1.1 序列的操作 所有序列类型都 ...

  8. Genymotion关于【启动后player.exe已停止运行】解决方案总结

    1. 你硬盘空间不足,或是暂存区不够,请少执行一些程序或关掉一些p2p的程序,或是到控制面板卸载一些不必要的程序.最好的建议是定期进行硬盘清理,确保不浪费多余空间 ---以上来源(http://www ...

  9. shell实现的守护进程

    代码本来是别人那里拿来的,自己又改了下,给busybox用. #! /bin/sh PRO_PATH=/opt/myapp PROGRAM=packet_analyzer while true ; d ...

  10. C#点击按钮关闭当前窗体 打开另一个窗体。

    网上有很多是隐藏当前窗体,但是这样占用资源,效果不好,因此改进方法如下: private void button1_Click(object sender,EventArgs e) { this.hi ...