天天看点

OC协议和id协议OC协议NSObject基协议id【泛型指针】

协议

两个事物之间达成某些约定,协议规定了遵守协议的事物

【协议作用】

协议就是来规范接口

代码中的协议【只有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协议中的方法