码迷,mamicode.com
首页 > 其他好文 > 详细

[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十三章 协议

时间:2015-08-11 21:33:04      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:objective-c   协议   ios开发   ios   

13.1 协议

正式协议:包含了方法和属性的有名称列表

注意:

  1. 采用协议后,类就要实现该协议的所有方法
  2. 通常情况下,一个协议只有少数几个需要实现的方法.
  3. 在协议中,不会引用新的实例变量

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 复制

复制的种类

  1. 浅层复制:只会复制指向引用对象的指针,对象总数不变,指针数目*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

注意:

  1. zone是NSZone类的一个对象,指向一块可供分配的内存区域。
  2. 当向对象发送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;//设置委托:只有遵守该协议的对象才能被设置为委托

版权声明:本文为博主原创文章,未经博主允许不得转载。

[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十三章 协议

标签:objective-c   协议   ios开发   ios   

原文地址:http://blog.csdn.net/apple890111/article/details/47426453

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!