标签:objective-c 协议 ios开发 ios
正式协议:包含了方法和属性的有名称列表。
注意:
@protocol NSCopying
- (id) copyWithZone: (NSZone *) zone;
@end
//如果采用了NSCopying协议,你的对象将会知道如何创建自身的副本
@protocol MySuperDuberProtocol <MyParentProtocol>
@end
//需要实现两个协议中的所有方法
注意:协议中不会引入信新的实例变量
@protocol NSCoding
//将对象的实例变量转换为NSCoding类的对象
- (void) encodeWithCoder: (NSCoder *) aCoder;
//从NSCoder类的对象中提取经过转换的实例变量,并使用它们去初始化新的对象
- (id) initWithCoder: (NSCoder *) aDecoder;
@end
@interface Car : NSObject <NSCopying, NSCoding>
{
// 该类的对象可以对自身进行编码解码;能够创建自身的副本
}
// methods
@end // Car
复制的种类
@interface Engine : NSObject <NSCopying>
@end // Engine
@implementation
- (id) copyWithZone: (NSZone *) zone
{
Engine *engineCopy;
engineCopy = [[[self class] allocWithZone: zone] init];
return (engineCopy);
} // copyWithZone
注意:
[self class];//获得self参数所属的类,当前类,非子类
allocWithZone:是类方法:
+ (id) allocWithZone: (NSZone *) zone;
allocWithZone:
是类方法,分配内存并创建一个该类的新对象,返回一个保留计数器值为1且不需要释放的对象。
init
:初始化新对象
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方法来初始化,用访问器方法来修改对象的属性。
@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.
//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);
}
限定参数:接收的对象必须是接受的对象
-(void)setObjectValue:(id<NSCopying>) object;
@protocol BaseballPlayer
- (void)drawHugeSalary; //必须实现
@optional
- (void)slideHome;
- (void)catchBall;
- (void)throwBall;
@required
- (void)swingBat; //必须实现
@end // BaseballPlayer
注意:
Cocoa中的非正式协议逐渐被替换成了带有@optional方法的正式协议。
委托:某个对象指定另一个对象处理某些特定任务的设计模式,委托要遵守协议
NSNetServiceBrowser类的委托方法:
-(id<NSNetServiceBrowserDelegate>)delegate;//返回当前的委托对象
-(void)setDelegate:(id<NSNetServiceBrowserDelegate>)delegate;//设置委托:只有遵守该协议的对象才能被设置为委托
版权声明:本文为博主原创文章,未经博主允许不得转载。
[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十三章 协议
标签:objective-c 协议 ios开发 ios
原文地址:http://blog.csdn.net/apple890111/article/details/47426453