OC学习:SEL类型数据和selector的用法


Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。

一、SEL

 每个SEL类型数据都是一个方法。

SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。


注意:

这个过程是有缓存的,第一次找SEL对应的方法是逐条找,比较耗性能,但是找过一次之后,便会留下缓存数据,再找就直接访问缓存了。


例如,声明方法:

@interface Person : NSObject 
+ (void)test1; 
- (void)test2; 
- (void)test3:(NSString *)abc;
@end 


实现后,像如下一样直接调用:

Person *person = [[Person alloc] init]; 

[p test1];

二、selector

上例中,也可这样利用selector来间接调用:

[p performSelector: @selector(test2)];

同样调用test3可以这样:
[p test3: @"123"];

或:
[p performSelector:@selector(test3:) withObject:@"123"];


这样,我们就可以通过一个方法名字符串来调用此方法:

NSString *name = @"test2";
SEL s = NSSelectorFromString(name);

[p performSelector:s];

其实每个方法内部都有一个_cmd变量,其是SEL类型变量,代表当前方法。

NSString *str = NSStringFromSelector(_cmd);
NSLog(@"%@",str);

上面的打印语句就是将当前的方法名打印出来,这里的_cmd其实就相当于@selector(test2)。


所以,其实消息就是SEL。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值