OC-协议
2015-12-06 21:06
295 查看
OC-协议
基础
协议是一个类可以选择实现的一组定义的方法(类似java中的接口)OC中协议分为:正式协议和非正式协议
正式协议: 协议中的方法都要实现
非正式协议: 可以选择实现
声明协议
协议的声明位于头文件中
协议没有对应的实现文件
在OC2.0之后允许把协议方法标记为可选或必须的
采用协议的类必须实现协议的所有必须方法
@required是默认的
@protocol DrawableItem @required -(void) drawItem; -(NSRect) boundingBox; -(void) setColor:(NSColor*)color; @optional -(NSString)labelText; @end
采用协议
一个类可以通过在@interface行中添加用尖括号括住的协议名称,来告诉编译器它采用哪个协议
如果一个类采用协议或者他继承自摸个采用协议的类,那么这个类就必须遵守协议
一个类可以采用多个协议:在单独一组尖括号中列出这些协议,并用逗号分隔他们
协议的顺序是不重要的
@interface AcmeUniversalBolt: AcmeComponent<DrawableItem, NSCopying>
协议作为类型
声明一个变量时,可以通过向类型声明中添加协议名称,把变量声明为一种可以保存遵守协议的对象的类型
id<DrawableItem> currentGraphic; //currentGraphic所指向的对象必须遵守DrawableItem协议
属性和协议
如果某些协议方法是访问器方法,就可以使用属性语句在协议头文件中声明他们
采用这种协议的任何类都必须合成与属性对应的访问器,或者提供他们的实现, 就向在类的@interface部分声明属性一样
@protocol DrawableItem -(void) drawItem; @property (nonatomic, retain) NSString* name; @end
NSObject类和NSObject协议
既有NSObject类,也有NSObject协议
NSObject是几乎所有的OC对象的根类
NSObject协议是一个正式协议,其中列出了任何类为成为良好的OC“公民”而必须实现的方法。
NSObject类采用NSObject协议,然后大多数类都将直接或者间接的从NSObject继承这些方法
Foundation的另一个根类是NSproxy(用于构建分布式系统), 也采用NSObject协议
协议对象
协议对象是代表协议的对象,他们是Protocol类的成员
利用@protocol()指令从协议的名称中获得协议对象。
与类对象不同,协议对象没有方法
他们只能被用于为NSObject类的conformsToProtocol:方法的参数
这个方法可以用于判断接收者是否实现了协议中所有必须的方法
即,可以使用这个方法来判断一个对象(或者类)是否遵守协议、
Protocol myDataSourceProtocol = @protocol(TablePrinterDataSource); //判断对象或者类是否遵守协议 if( [newDataSource conformsToProtocol: @protocol(TablePrinterDataSource)] ) { //TODO } or if([Person conformsToProtocol: @protocol(TablePrinterDataSource)]) { //TODO }
非正式协议
说白了就是没有实现方法的类别
如果一个类别只有头文件却没有实现,编译器是不会报错的
但是应注意的是:
在编码采用非正式协议的类时,协议的方法实现必须位于类的@implementation部分,而不是类别的@implementation部分
如果把这些方法放在单独的类别@implmentation部分,则是将把所有方法实现添加到所有类中!!!!
相关文章推荐
- 使用XmlPullParser解析xml
- OC-属性
- CentOS7 本地源搭建
- What is the relationship between Xcode, Swift and Cocoa?
- 1044. Shopping in Mars (25)【二分】——PAT (Advanced Level) Practise
- POJ-2864
- Ehcache使用简单介绍
- 什么叫集群?如何实现集群?
- 分支语句 (if) 练习 Java代码
- 【转载】COM 组件设计与应用(十二)——错误与异常处理
- OC-访问控制与安全
- OC-类别与扩展
- HDU 5592 ZYB's Premutation
- 宏规则
- 福克纳诺贝尔文学奖获奖演说
- SQLiteDatabase
- ionic的安装
- VS2013控制台一闪而过问题解决方法
- J2EE——Jsp的学习
- [AC自动机]个人对于AC自动机的理解