Objective-C - SEL (@selector) 原理及本质

SEL (@selector) 原理及本质

/*
 1.SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法

[email protected]()就是取类方法的编号,等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)

3.其实消息就是SEL
 */

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

int main()
{
    Person *p = [[Person alloc] init];

    [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 0;
}
@interface Person : NSObject

+ (void)test;

- (void)test2;

- (void)test3:(NSString *)abc;

@end
@implementation Person
+ (void)test
{
    NSLog(@"test-----");
}

- (void)test2
{
    // _cmd代表着当前方法

    NSString *str = NSStringFromSelector(_cmd);

    // 会引发死循环
    // [self performSelector:_cmd];

    NSLog(@"调用了test2方法-----%@", str);
}

- (void)test3:(NSString *)abc
{
    NSLog(@"test3-----%@", abc);
}
@end
时间: 2024-10-11 17:17:03

Objective-C - SEL (@selector) 原理及本质的相关文章

IOS SEL (@selector) 原理及使用总结(二)

SEL消息机制工作原理是什么 引用下面文章: 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa 的成员变量[公共继承].而该 isa 变量指向该对象的类(图3.15)[类在Objective-C中也是一个实体, 由于存在Objective-C 运行环境所有的类将有自己的存储空间.Objective-C 运行环境将为每个类分配空间. 这里 所说的 isa,正是指向这样一个类的空间.

IOS SEL (@selector) 原理及使用总结(一)

SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取. 它的结果是一个SEL类型.这个类型本质是类方法的编号(函数地址) C/C++函数指针 int test(int val) {return val+1; } int (* c_func)(int val); //定义一个函数指针变量c_func

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

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取. 它的结果是一

paip.日志中文编码原理问题本质解决python

默认的python日志编码仅仅gbk...保存utf8字符错误..输出到个eric5的控制台十默认好像十unicode的,要是有没显示出来的字符,大概十字体问题..调整eric5的字体走ok兰. #调用封装 from log import * iniLog (r"c:\enPn2atiEnPh.log") logx("xxx") #主要的代码 设置文件编码为utf8 handler = logging.FileHandler(logfile, "a&quo

SEL selector (二)

SEL消息机制工作原理是什么 引用下面文章: 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa 的成员变量[公共继承].而该 isa 变量指向该对象的类(图3.15)[类在Objective-C中也是一个实体, 由于存在Objective-C 运行环境所有的类将有自己的存储空间.Objective-C 运行环境将为每个类分配空间. 这里 所说的 isa,正是指向这样一个类的空间.

SEL selector

SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取. 它的结果是一个SEL类型.这个类型本质是类方法的编号(函数地址) C/C++函数指针 int test(int val) {return val+1; } int (* c_func)(int val); //定义一个函数指针变量c_func

Android Selector原理

android的selector对于android开发者而言再熟悉不过了,只要定义一个drawable目录下定义一个selector的xml文件,在布局文件中引用这个xml文件或者在代码中setBackgroundDrawable的时候使用此xml就可以实现控件按下或有焦点等不同状态的效果. 那么setBackgroundDrawable后为什么可以实现这个功能呢? 首先要了解一个Drawable类,Drawable是一个抽象的可绘制的图片类,这个类可以从一个本地路径中创建一个图片,也可以使用从

Atitit paip.对象方法的实现原理与本质.txt

对象方法是如何实现的1 数组,对象,字典1 对象方法是如何实现的 这显然是一个对象方法调用.但对象方法是如何实现的呢?在静态语言中,因为有编译过程,所以我们把一个结构放在内存里,并使得它 - 拥有一个对象实例指针指向obj, - 拥有一个对象方法指针指向aMethod()在代码区的地址, - 在有效代码的前后加入处理x,y,z这些参数的代码(例如入栈与清栈). 在执行时,我们将obj与aMethod交给执行系统,并传入指定参数(的序列),然后就可以按照既已编译的规则来执行了 数组,对象,字典 是

***iOS开发中@selector的理解与应用

@selector 是什么? 1一种类型 SEL2代表你要发送的消息(方法), 跟字符串有点像, 也可以互转.: NSSelectorFromString() / NSSelectorFromString() 3可以理解为类似函数指针的东西--是能让Objective-C动态调用方法的玩意.--是 object-c 的动态后绑定技术 可以通过字符串 访问的函数指针4其实就是消息响应函数---选一个消息响应的函数地址给你的action[email protected](function_name)