初学阶段,我觉得只要理解SEL是什么,还有一些基本用法就行了。实际运用SEL也就是调用方法的一种方式。
一下是我总结的一些知识,希望对你有帮助。
SEL数据类型
一个SEL类型的数据就代表一个方法。
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法。可以直接拿到方法地址就不用先包装成SEL类型的数据了,大大减少性能的开销。用到的其实是C语言的一些高级特性。
其实消息就是SEL
1.方法的存储
在类对象中有方法列表,每个方法都有一个和它对应的SEL数据,SEL数据(对象)对应的是方法的地址
[p test2] 发送消息实际就是发送一个SEL类型的数据
1>首先会把test2这个方法名包装秤SEL类型的数据。
2>根据SEL数据去类中找和它对应的方法地址。
3>根据方法地址调用方法。
这个操作是由缓存的。首次找会挨个找,很耗性能。第再次找得时候它会使用上一次的查询结果。
2.价值,使用方法
间接调用方法
首先将方法名包装成一个SEL类型的数据,通过@selector(方法名). SEL s = @selector(test2);
[p performSelector:@selector(test2)]; 这样也可以调用test2方法
带参数(冒号也是方法名的一部分)
[p performSelector:@selector(test3:) withObject:@“223”];
3.其他用法
1>知道一个方法名的字符串形式也可以调用一个方法
NSString *name = @“test2”;
SEL s = NSStringFromSelector(@“test2”);
2>每个方法内部都有一个隐藏的SEL类型的_cmd数据,这个数据代表当前方法。_cmd ==@selector(当前方法名)
NSString *str = NSStringFromSelector(_cmd); 将SEL数据转化成字符串。 |