[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十八章 复制对象

原创 2015年07月10日 22:21:07
origin = pt; 
  • 将对象pt的地址复制到origin中。两个变量都指向内存中同一个地址
  • Foundation对象:将一个变量赋值给另一个对象仅仅创建了另一个对这个对象的引用(地址)。

Part 1.copy 和 mutablecopy 方法:创建对象的副本

  • 复制对象(的引用)
 dataArray2 = dataArray;//创建了内存中同一数组对象的另一个引用:总共一个数组
  • 创建对象的副本
 dataArray2 = [dataArray mutalbeCopy];//创建信的dataArray副本并复制了所有元素:总共两个数组
  • 注意:可以创建可变对象的不可变副本。也可以创建不可变对象的可变副本。

Part 2. 浅复制与深复制

Part 2.1 浅复制

        NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:

        [NSMutableString stringWithString:@"one"],
        [NSMutableString stringWithString:@"two"],
        [NSMutableString stringWithString:@"three"],nil];

         NSMutableArray *dataArray2;
         NSMutableString *mStr;    

         dataArray2 = [dataArray mutableCopy]; 
        //两个数组(dataArray,dataArray2)的元素都指向内存中同一个字符串,等同于一个对象赋值给另一个对象,属于浅复制

        mStr = dataArray[0];
        //检索dataArray第一个元素 dataArray[0]返回的对象和dataArray中的一个元素指向内存中的同一个对象。

        [mstr appendString:@"ONE"];
        //改变mstr的同时改变了dataArray的第一个元素。由于浅复制,dataArray2也发生了改变,因为浅复制只是复制了对象的引用,内容被更改即被更改。

Part 2.2 深复制

  • 创建数组中每个对象内容的副本,而不仅仅是这些对象引用的副本。
  • 更改dataArray2中的第一个元素,而不改变dataArray的第一个元素:
mStr = [NSMutableString stringWithString: dataArray2[0]];
//创建一个新字符串,并存储到dataArray2的第一个位置。

[mStr appendString @"ONE"];
[dataArray2 replaceObjectAtIndex: 0 withObject: mStr];
//更改mStr并添加得到数组中

Part 3. 实现 < NSCopying > 协议

  • 若要对自己的类进行复制,必须根据协议实现其中的方法。

  • 协议:实现copyWithZone:方法来响应copy消息,返回不可变副本

  • 协议:实现mutableCopyWithZone:方法,返回可变副本

在Fraction类创建新的分数

@interface FractionNSObject <NSCopying>

-(id) copyWithZone: (NSZone *)zone
{
  Fraction *newFact = [[Fraction allocWithZone: zone] init];

  [newFact setTo: numerator over: denominator];

  return newFact;
}
Fraction *f1 = [[Fraction alloc]init];
Fraction *f2;

[f1 setTo: 2 over 5];

f2 = [f1 copy]; //产生f1的副本,产生新的Fraction,将f1复制其中

[f2 setTo: 1 over: 3];

[f1 print]; // 2/5 复制的操作对f1没有影响
[f2 print]; // 1/3

注意

  • 如果将copy语句改成 f2 = f1,则改变f2的同时会改变f1。
  • 如果产生此类的子类,copyWithZone:方法将被继承:
Fraction *newFact = [[Fraction allocWithZone: zone] init];
应该改为:
id newFract = [[self class allocWithZone: zone] init];

Part 4. 用设值方法和取值方法复制对象

赋值:

newCard.name = newName; //设置对象(AddressCard)的名称(姓名)

设值方法:

-(void) setName: (NSString *) theName
{
   name = theName; //简单将参数赋值给了相应的实例变量
}

如果修改了newName的字符
为了避免改变其他对象的值,比较安全的做法是在设值方法中将对象复制一份。

使用copy版本的setName方法:

-(void) setName: (NSString *) theName
{
   name = [theName copy];
}
  • 属性的copy特性:
@property (nonatomic,copy) NSString *name;

synthesize 一同使用等效于:

-(void) setName: (NSString *) theName
{
   if (theName != name)
   name = [theName copy];
}

Objective-C考试2015年12月最新题库的试题

※ 选择题(共80题,每题1分)               1、OC中布尔(BOOL)类型的变量的值只有:答案:(B)             A、1/0             B、YES/NO ...
  • sanzhanggui123
  • sanzhanggui123
  • 2015年12月12日 15:47
  • 2097

objective-c 基本类型和对象类型解读

我将用最简单的话来描述我所理解的oc数据类型。       1.基本类型(primitive type)    (1) 常用数据类型  int / float /long / Boolen /NS...
  • qq_28699153
  • qq_28699153
  • 2015年12月25日 11:49
  • 322

Objective-C中copy的使用(深拷贝、浅拷贝详解)

摘要 在Objective-C中,一个对象可以调用copy或mutableCopy方法来创建一个副本对象,本文着重讲解如何正确使用copy的功能.  首先,什么是copy?  ...
  • hongfengkt
  • hongfengkt
  • 2015年08月14日 14:44
  • 1421

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法

本人于2015年6月10日开始自学ios开发。 此学习笔记是本人在学习《Objective-C 程序设计 第六版》的过程中,经本人修改,整理的内容。 略过第一,二章,从第三章有关类的概念开始。 ...
  • apple890111
  • apple890111
  • 2015年06月25日 01:11
  • 534

Objective-C中的同步线程的锁

概述在多线程编程中往往会遇到多个线程同时访问共享的资源,这种情况我们需要通过同步线程来避免。也就是给线程加锁。 因为Objective-C是C语言的超集。,严格的来说是真超集。所以C语言当中的pth...
  • GGGHub
  • GGGHub
  • 2016年05月09日 16:01
  • 3123

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法 课后题解析 3-7

第三章的课后题多半都比较主观,在此只分享第七题。第七题几乎囊括了第三章左右的知识点,非常典型。以下是题目和本人编写的代码。为了方便起见,将头文件,实现文件,主函数文件合并到了一起。 3-7 定义一...
  • apple890111
  • apple890111
  • 2015年06月25日 11:53
  • 1024

iOS 面试题(1):一个 Objective-C 对象的内存结构是怎样的?

接下来分享的将会是唐老师一系列的iOS面试题,因为之前好几期唐老师都删掉了,说是要出书,所以转载过来,需要的朋友们可以看下,也方便我自己巩固、学习。 转载自:http://mp.weixin...
  • tyuersunshine
  • tyuersunshine
  • 2017年02月21日 18:00
  • 511

Objective-C 【类方法/对象方法-匿名类-new&alloc init区别】

——————————————————————————————————————————— 类方法   ①类方法:        + 开头的方法(定义的过程形式和对象方法一样,只不过 + 开头,这是唯...
  • Felicity294250051
  • Felicity294250051
  • 2015年08月20日 09:44
  • 1547

黑马程序员-面向对象的理解以及Objective-C方法和对象分配内存的学习笔记

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1、OC与C的区别: 从解决问题的思想方面,OC是面向对象,C是面向过程。 在MAC里面实现的...
  • u012749656
  • u012749656
  • 2015年05月31日 22:11
  • 540

iOS中使用KVC实现JSON数据与Objective-C实体对象之间的转换

JSON数据,一种极其常用的数据传输格式,在iOS开发当中,经常会遇到需要将NSO...
  • lsc19890723
  • lsc19890723
  • 2014年11月09日 21:11
  • 1497
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十八章 复制对象
举报原因:
原因补充:

(最多只允许输入30个字)