1.1 正式协议
正式协议是包含了方法和属性的有名称列表。正式协议要求显式地采用。采用协议的办法是在类的@interface声明中列出协议的名称。采用协议后,你的类就要遵守该协议,并且承诺该协议必须实现的所有方法。
通常情况下,一个协议只有少数几个需要实现的方法,你必须实现所有这些方法才能获得一系列有用的功能。
1.1.1 声明协议
@protocol 协议名称, 注意: 协议名称必须唯一。
协议也可以继承父协议,在声明语句协议名称后面的尖括号内可以指定父协议的名称。如果,你继承了父协议,你就得实现两个协议中所有需要实现的方法。你可以使用NSObject作为根协议。NSObject类符合NSObject协议,所有对象都符合NSObject协议。将NSObject协议作为你编写协议的父协议是一个不错的方式。
接下来是一个方法声明列表,所有采用了此协议的类都必须实现这些方法。协议声明以@end结束。
1.1.2 采用协议
要采用某个协议,你可以在类的声明中列出该协议的名称,并用尖括号括起来。你可以按任意顺序列出很多协议。
1.1.3 实现协议
1.2 复制
copy消息会告诉对象创建一个全新的对象,并让新对象与接收copy消息的原对象完全一样。
复制的种类:深层复制和浅层复制,可变复制与不可变复制。
浅复制:不会复制所引用的对象,新复制的对象只会指向现有的引用对象。实质复制的不是引用对象本身,而是复制指向引用对象的指针。
深复制:复制所引用的对象。
1.2.1 复制Engine
copyWithZone:(Zone *)zone, zone是NSZone类的一个对象,指向一块可供分配的内存区域。当你向一个对象发送copy消息时,该copy消息在到达你的代码之前会被转换为copyWithZone:方法。
1.2.2 复制Tire
方便的指针
你可以像下面这样使用C语言风格的指针运算符直接访问实例变量。
tireCopy->pressure = pressure;
tireCopy->treadDepth = treadDepth;
一般来说,当设置属性不太可能涉及额外工作时,我们尽量使用init方法和访问器方法。
子类可以获得父类的所有属性。
如果一个类是可以复制的类的子类,(在实现其copyWithZone方法时)它不需要实现allocWithZone:方法,也不需要使用[self class]形式,只需要请求父类执行copyWithZone:方法即可, 然后设置子类特有的实例变量的值即可。
1.2.3 复制Car
编码要有安全防御意识。
1.2.4 协议和数据类型
在使用的数据类型中为实例变量和方法参数指定协议名称,有助于编译器检查代码错误。
id类型表示一个可以指向任何类型的对象的指针,它是一个泛型对象类型。你可以将任何对象复制给一个id类型的变量,也可以将一个id类型的变量复制给任何对象的对象指针。
1.3 Objective-C 2.0的新特性
协议修饰符@optional和@required,非正式协议已被替换为带有@optional方法的正式协议。
1.4 委托方法
委托,又可以称之为代理,是一个经常与协议共用的特性。委托就是某个对象指定另一个对象处理某些特定任务的设计模式。
委托必须首先询问委托对象是否实现了某个方法,如果实现了,它才要求委托对象处理这个方法。
网友评论