基 础 知 识( SEL )
SEL代表方法,一个SEL类型数据代表一个方法。
每个对象都有一个isa指针。
每个方法都有一个与之相对应的SEL数据。
当对象调用方法时,首先会把方法包装成SEL类型的数据,通过包装后的SEL数据找到相对应的方法的地址,调用方法。
在内存中每一个SEL数据都对应一个方法的地址。
SEL就是方法的包装类型。
SEL这个操作是有缓存的:
因为SEL在寻找地址的时候是一个一个的找,很耗费性能。但是再第二次找的话,就会直接利用第一次的结果。(第一次会把结果记录到缓存中)。
调用方法还有另外一种方式:
1,直接调用 [p 方法名];
2, 间接调用 [p performSelector:@selector(方法名)];
怎么创建SEL数据:SEL全称 selector SEL就是selector这个对象。
@selector(selector) 返回一个selector类型的数据
@selector(方法名):就是SEL类型的数据。
调用某个对象方法,就是给对象发送了一个SEL类型的数据,根据SEL数据到内存中找对应方法的地址,调用方法。
其实发消息就是发送的SEL,你把方法名包装成了一个SEL类型的消息,发送给这个对象,
根据SEL消息找对应的方法的地址,调用方法。
对象方法接收参数
-(void)test: (NSString *) a
{
[p performselector: @selector(test:) withObject :@"123123"]
}
主函数打印[p test: @"123123"]
SEL的含义:
typedef struct objc select *SEL; 定义selector 叫SEL.
字符串类型
NSString * name = @“test”
不能直接调用字符串,如: [p name] 错误语法。
需要转换成SEL 类型。
怎样把字符串转换成SEL类型。
SEL = [NSSelectorFromString:(name)];
[p performSelect:s ]; 然后调用。
每个对象内部都有一个隐藏的 _cmd,属于SEL.
不能直接打印转换
NSStringFromSelector: _cmd;
SEL会引发死循环:[self performSelector: _cmd];