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

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;//设置委托:只有遵守该协议的对象才能被设置为委托

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

时间: 2024-08-27 04:37:38

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

Ajax本地跨域问题 Cross origin requests are only supported for HTTP(针对jQuery基础教程第四版第六章)

出现的问题: 解决的步骤: 谷歌浏览器出现的效果: 针对jQuery基础教程(第四版),第六章  成功: 原文地址:https://www.cnblogs.com/qinghui258/p/8432569.html

PHP 学习笔记(一):基础教程:语法,变量,函数,数组,超全局

PHP简介 PHP 脚本在服务器上执行. 什么是 PHP 文件 PHP 文件能够包含文本.HTML.CSS 以及 PHP 代码 PHP 代码在服务器上执行,而结果以纯文本返回浏览器 PHP 文件的后缀是 ".php" PHP能够做什么 PHP 能够生成动态页面内容 PHP 能够创建.打开.读取.写入.删除以及关闭服务器上的文件 PHP 能够接收表单数据 PHP 能够发送并取回 cookies PHP 能够添加.删除.修改数据库中的数据 PHP 能够限制用户访问网站中的某些页面 PHP

python基础学习笔记——Python基础教程(第2版 修订版)第一章

#模块 import math math.floor(9) from math import sqrt sqrt(9) #无需使用前缀 import cmath cmath.sqrt(-1) #不能使用from...inport #转义和单双引号 >>>"\"hello,word\"she said" '"hello,word"she said' #使用print不显示引号 #拼接字符串  + #输入 input raw_inp

python基础学习笔记——Python基础教程(第2版 修订版)第二章(列表和元祖)

#列表可修改,元祖不能 A=['sdsd',43] B=['sds',45] C=[A,B] #分片 : - #list函数 #分片赋值 #列表方法 lst.append(4) x.count(1) x.count([1,2]) a.extend(b) a.index("w") a.insert(3,"都")x.removex.reversex.sort #pop 移除列表元素,并返回值.实现数据结构-栈,LIFO(后进先出),x.append(x.pop()),先

笔记-Python基础教程(第二版)第一章

第一章 快速改造:基础知识 01:整除.乘方 (Python3.0之前 如2.7版本) >>> 1/2 ==>0 1/2整除,普通除法: 解决办法1: 1.0/2.0  ==>0.5 解决办法2:from _future_ import division 1/2  ==>0.5 // 表示整除 >>>1//2 ==>0 浮点数//浮点数,结果依然是整除结果 >>>1.0//2.0 ==>0.0 实际操作截图: ** 表示乘

jQuery基础教程(第四版)第4章练习:

关于答案: // (1) 修改样式表,一开始先隐藏页面内容,当页面加载后,慢慢地淡入内容:$(document).ready(function() { $('body').hide().fadeIn(4000);}) // (2) 在鼠标悬停到段落上面时,给段落应用黄色背景:$(document).ready(function() { $('p').mousemove(function(event) { //鼠标进入的时候 $(this).css('background','yellow');

jQuery基础教程(第四版)第3章练习:

关于答案: // // (1) 在Charles Dickens被单击时,给它应用 selected 样式.$(document).ready(function() { $('#header').on('click',function() { $('.author').addClass('selected') });}) // (2) 在双击章标题( <h3 class="chapter-title"> )时,切换章文本的可见性.$(document).ready(func

《Python基础教程 第2版&#183;修订版》 第2章 列表和元组(学习笔记&#183;总)

这章东西有点多,因此,分成了三份来写,总体来说,这章内容较基础,以下是一二三的链接 <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·一) <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·二) <Python基础教程 第2版·修订版>第2章 列表和原组 (学习笔记·三) 版权声明:本文为博主原创文章,未经博主允许不得转载.

《python基础教程(第二版)》学习笔记 字符串(第3章)

<python基础教程(第二版)>学习笔记 字符串(第3章)所有的基本的序列操作(索引,分片,乘法,判断成员资格,求长度,求最大最小值)对字符串也适用.字符串是不可以改变的:%左侧是格式字符串,右侧是需要格式化的值print '%s=%d' % ('x',100) ==> x=100%% 格式字符串中出现 %模板字符串:from string import Templates=Template('$x is 100');  s.substitute(x='ABC');  ==> '

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__