13.1 协议
正式协议:包含了方法和属性的有名称列表。
注意:
- 采用协议后,类就要实现该协议的所有方法。
- 通常情况下,一个协议只有少数几个需要实现的方法.
- 在协议中,不会引用新的实例变量。
13.11 声明协议
- NSCopying 协议
@protocol NSCopying
- (id) copyWithZone: (NSZone *) zone;
@end
//如果采用了NSCopying协议,你的对象将会知道如何创建自身的副本
- 继承父协议
@protocol MySuperDuberProtocol <MyParentProtocol>
@end
//需要实现两个协议中的所有方法
注意:协议中不会引入信新的实例变量
- NSCoding 协议
@protocol NSCoding
//将对象的实例变量转换为NSCoding类的对象
- (void) encodeWithCoder: (NSCoder *) aCoder;
//从NSCoder类的对象中提取经过转换的实例变量,并使用它们去初始化新的对象
- (id) initWithCoder: (NSCoder *) aDecoder;
@end
13.12 采用协议
@interface Car : NSObject <NSCopying, NSCoding>
{
// 该类的对象可以对自身进行编码解码;能够创建自身的副本
}
// methods
@end // Car
13.2 复制
复制的种类
- 浅层复制:只会复制指向引用对象的指针,对象总数不变,指针数目*2。
- 深层复制:复制引用的对象,对象总数*2。
13.21 复制engine对象
- engine类(无实例变量)的接口:
@interface Engine : NSObject <NSCopying>
@end // Engine
- engine类的声明,采用了NSCopying协议,就必须实现conyWtihZone:方法
@implementation
- (id) copyWithZone: (NSZone *) zone
{
Engine *engineCopy;
engineCopy = [[[self class] allocWithZone: zone] init];
return (engineCopy);
} // copyWithZone
注意:
- zone是NSZone类的一个对象,指向一块可供分配的内存区域。
- 当向对象发送copy消息时,该copy消息在到达你的代码之前会被转化为copyWithZone:方法。
[self class];//获得self参数所属的类,当前类,非子类
allocWithZone:是类方法:
+ (id) allocWithZone: (NSZone *) zone;
allocWithZone:
是类方法,分配内存并创建一个该类的新对象,返回一个保留计数器值为1且不需要释放的对象。
init
:初始化新对象
13.22 复制Tire
Tire类(有两个实例变量)的接口(采用NSCopying协议):
@interface Tire : NSObject <NSCopying>
{
float pressure;
float treadDepth;
}
// ... methods
@end // Tire
实现copyWithZone:
方法
- (id) copyWithZone: (NSZone *) zone
{
Tire *tireCopy;
tireCopy = [[[self class] allocWithZone: zone]
initWithPressure: pressure
treadDepth: treadDepth];
return (tireCopy);
} // copyWithZone
注意:这里采用了Tire类的指定初始化函数,但不是必须的。在设置属性不太可能跟涉及额外工作时,我们也可以使用简单的init方法来初始化,用访问器方法来修改对象的属性。
13.23 复制AllWeatherRadial类(Tire类的子类)
@interface AllWeatherRadial : Tire
- properties;
- methods;
@end
注意:此类是Tire类的子类,获得了NSCopying协议。
- (id) copyWithZone: (NSZone *) zone
{
AllWeatherRadial *tireCopy;
tireCopy = [super copyWithZone: zone];
[tireCopy setRainHandling: rainHandling];
[tireCopy setSnowHandling: snowHandling];
return (tireCopy);
} // copyWithZone
本代码解释:
This class just asks its super- class for a copy and hopes that the superclass does the right thing and uses [self class] when allocating the object. Because Tire’s copyWithZone: uses [self class] to determine the kind of object to make, it will create a new AllWeatherRadial.
13.24 复制Car类
//Car:
@interface Car : NSObject <NSCopying>
{
NSMutableArray *tires;
Engine *engine;
}
// ... methods
@end // Car
实现 copyWithZone:
方法:
//Car.m
- (id) copyWithZone: (NSZone *) zone
{
Car *carCopy;
//self所属的类分配新对象
carCopy = [[[self class] allocWithZone: zone] init];
carCopy.name = self.name;
Engine *engineCopy;
engineCopy = [[engine copy] autorelease];
carCopy.engine = engineCopy;
int i;
for (i = 0; i < 4; i++)
{
Tire *tireCopy;
tireCopy = [[self tireAtIndex: i] copy];
[tireCopy autorelease];
[carCopy setTire: tireCopy atIndex: i];
}
return (carCopy);
}
13.25 参数类型:id
限定参数:接收的对象必须是接受的对象
-(void)setObjectValue:(id<NSCopying>) object;
13.3 Objective-C 2.0新特性
@protocol BaseballPlayer
- (void)drawHugeSalary; //必须实现
@optional
- (void)slideHome;
- (void)catchBall;
- (void)throwBall;
@required
- (void)swingBat; //必须实现
@end // BaseballPlayer
注意:
Cocoa中的非正式协议逐渐被替换成了带有@optional方法的正式协议。
13.4 委托方法
委托:某个对象指定另一个对象处理某些特定任务的设计模式,委托要遵守协议
NSNetServiceBrowser类的委托方法:
-(id<NSNetServiceBrowserDelegate>)delegate;//返回当前的委托对象
-(void)setDelegate:(id<NSNetServiceBrowserDelegate>)delegate;//设置委托:只有遵守该协议的对象才能被设置为委托
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-08-27 04:37:38