OC协议和id

来源:互联网 发布:ec软件使用 编辑:程序博客网 时间:2024/06/07 20:13

协议

两个事物之间达成某些约定,协议规定了遵守协议的事物
【协议作用】
协议就是来规范接口

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

原创粉丝点击