13.1 正式协议
说明:正式协议类似
Java
的接口。
- 声明协议:通过
@protocol
创建协议的声明。- 采用协议:在类的
@interface
声明中列出协议的名称。- 遵守协议:在类的
@implementation
中实现协议的所有方法(否则编译器会生成警告)。
13.1.1 声明协议
说明:类似类或类别的声明
- 可以继承父协议,类似继承父类
- 内部是方法声明列表
- 在协议中不会引入新的实例变量
语法:
1 | @protocol 协议名 <父协议名 |
Cocoa的NSCopying
协议
说明:如果采用了该协议,对象就会知道如何创建自己的副本。
1 | @protocol NSCopying |
Cocoa的NSCoding
协议
说明:能够对自身进行编码和解码
1 | @protocol NSCoding |
13.1.2 采用协议
说明:要采用某个协议,可以在类的声明中列出该协议的名称,并用
<>
括起来
语法:可以同时实现多个协议,中间用,
分隔
1 | @interface 类名: 父类明 <协议1, 协议2, ... |
1 | @interface Car: NSObject <NSCoping, NSCoding> |
13.1.3 实现协议
13.2 复制
说明:复制分为两类,
浅层复制(shallow copy)
和深层复制(deep copy)
复制 | 说明 |
---|---|
浅层复制 | 只会复制指向引用对象的指针 |
深层复制 | 将复制引用的对象 |
13.2.1 复制 Engine
说明:没有实例变量或属性。
Engine.h
1 |
|
Engine.m
1 |
|
13.2.2 复制 Tire
说明:有属性,要考虑实例变量(包括子类的)的复制,需要选择合适的构造函数或者使用
setter
修改对象的属性。
扩展:可以使用C
语言风格的指针运算符
直接访问实例变量。
1 | tireCopy->pressure = presssure; |
技巧:一般来说,当设置属性不太可能涉及额外工作时,我们尽量使用init方法和访问器方法。
Tire.h
1 |
|
Tire.m
1 |
|
13.2.3 复制 Car
Car.h
1 |
|
Car.m
1 |
|
13.2.4 协议和数据
说明:可以在实例变量和方法参数的后面添加
<协议名>
来对对象是够遵守协议进行类型检查。
1 | // 要求 object 遵守 NSCopying 协议,否则编译器会给出警告 |
13.3 Objective-C 2.0 的新特性
说明:
Objective-C 2.0
中增加了两个新的协议修饰符:@optional
和@required
,用来取代非正式协议
@optional
:后面的方法声明列表可以实现也可以不实现@required
后面的方法列表中的方法必须被实现优点(相比非正式协议):可以用来在类声明中明确表达我们的意图。
1 | @proptocol BaseballPlayer |
13.4 委托方法
说明:
委托
是一个经常与协议
共用的特性。
举例:管理者
将部分具体工作委托给工作人员
完成,工作人员类
采纳了指定协议
。
WorkerProtocol.h:工作人员类采纳的协议
1 |
|
Worker1.h + Worker1.m
1 |
|
1 |
|
Worker2.h + Worker2.m
1 |
|
1 |
|
Manager.h + Manager.m:管理者(会委托部分工作给设置的委托对象)
1 |
|
1 |
|
main.m
1 |
|