0x01 非正式协议
“非正式协议”(Informal Protocol)可以视为“类别”的别称,即凡是NSObject或其子类的类别,都是“非正式协议”。
可以从Apple官方的开发者文档看到:
1、非正式协议中的方法是否实现是可选的,因此在调用非正式协议中的方法之前,需要去检查对象类是否实现了它;
2、在Objective-C 2.0中引入可选的正式协议方法之前,非正式协议是Foundation和AppKit类实现委托的唯一方式。
0x02 响应选择器
选择器(Selector)只是一个方法名称,但它以Objective-C运行时使用的特殊方式编码,以快速执行查询。
可以使用@selector()编译指令圆括号中的方法名称来指定选择器:
//The selector for the Car method setEngine:
@selector(setEngine:)
//The selector for the setTire:atIndex:
@selector(setTire:atIndex:)
NSObject提供了一个名为respondsToSelector:的方法,该方法询问对象以确定其是否能够响应某个特定的消息:
Car *car = [[Car alloc] init];
if ([car respondsToSelector: @selector(setEngine:)]) //如果Car类对象存在setEngine:方法,则执行以下代码
{
NSLog (@"yowza!");
}
选择器可以被传递,可以作为方法的参数使用,甚至可以作为实例变量被存储。
利用这些特性,可以编写一些非常强大和灵活的代码!