协议
两个事物之间达成某些约定,协议规定了遵守协议的事物
【协议作用】
协议就是来规范接口
代码中的协议【只有OC有】
OC @protocal
其他语言类似的协议(只是类似)
JAVA 接口
C++ 抽象类
OC协议
规定了遵从协议的类,需要实现的方法
这个类遵守协议之后,这个类的实例对象也就遵守了协议
类似通过尖括号遵从协议,就必须实现要求的方法
【协议目的】实现通信
自定义IOSCode协议
自定义的协议,都要遵守NSObject协议
【一旦导入了协议的头文件,就代表当前类遵守协议】
import “IOSCode.h”
@protocal IOSCode <NSObject>
声明方法
-(void)writeIOSCode;
@required//必须要实现的【遵守协议的类必须要实现这个方法】【此属性可不写】
-(void) reading;
@optional//可选的【遵守协议的类可以实现这个方法,也可以不实现】
-(void)eat;
@end
NSObject基协议
协议的内容就是方法【协议直接写在.h文件中】
协议中不能写成员变量
协议中可以写多个方法
一旦遵守IOSCode协议,那么遵守协议的类必须要实现这个方法
协议中的方法,在类的.h文件中可以不声明
一旦遵守协议,那么协议中的方法必须要实现
【协议作用】规范方法/接口
类遵守了协议,那么这个类的实例对象也就遵守了
多了一个指针指向对象,计数器要➕1
id <IOSCode> staff = [xiaohuang retain];
staff : xiaohuang角色的转变
id【泛型指针】
staff还是一个泛型对象指针,这个指针遵守IOSCode协议
staff指针指向的对象也必须要遵守IOSCode协议,否则会报警
staff指针只能调用协议中的方法,否则会报警【看对象不看指针,所以仍然会执行对象的方法】—>ARC环境下直接报错
[staff writeIOSCode];
指针必须要指向遵守协议的类的对象
检测staff指向的对象是否遵守IOSCode协议
objective-c的和C++里的(void*)类似
PS:Objective-C和Java一样,都有运行时环境,有内省的能力。Objective-C和java有很多不同的地方,在iOS系统里,Objective-C的内存需要自己管理,添加了ARC机制后编译器帮助了Objective-C 添加release释放的代码。而Java是通过垃圾回收器管理内存的。
if([staff conformsToProtocal:@protocal(IOSCode)])
{
执行方法
}
通过选择器检测判断类中可选方法定义是否存在【方法在协议中是可选方法,但是没有定义】
if([staff respondsToSelector:@selector(drink)])
{
执行方法
}
派生时调用不同方法
for (id obj in arrar)
{
//会把同一个消息给不同的对象
//这些消息都会被相应,如果消息存在,那么没问题
//但是如果该消息不存在,程序就会爆炸
//【Want】不同的对象想要相应不同的消息
//【idea】判断该对象是哪一个类的对象
[obj eat];
//if ([obj isKindOfClass:[Qu class]])-->这样写也可以
if (YES==[obj isKindOfClass:[Qu class]]) {
[obj haha];
}
else if (YES==[obj isKindOfClass:[Bug class]])
{
[obj beatOthers];
}
}
遵守NSObject协议,普通类继承于NSObject类,就拥有了NSObject中的所有方法,遵守NSObject协议
【结论】:普通类不需要遵守NSObject协议中的方法