OC协议和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协议中的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值