Objective-C中的浅拷贝和深拷贝

原创 2016年06月01日 22:58:30

Objective-C中的浅拷贝和深拷贝

浅拷贝

浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:

1
2
char* str = (char*)malloc(100);
char* str2 = str;

浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。

iOS 里面的浅拷贝:

在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝。他既让几个指针共用同一片内存空间,又可以在release 由于计数的存在,不会轻易的销毁内存,达到更加简单使用的目的。

深拷贝:

深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

copy 与 retain 的区别:

copy 是创建一个新对象,retain 是创建一个指针,引用对象计数加一。 copy属性标识两个对象内容相同,新的对象retain count为1, 与旧有对象引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。

iOS里的深拷贝:

iOS提供了copy和mutableCopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutableCopy就是复制了一个mutable的对象。以下将举几个例子来说明。
这里指的是NSString, NSNumber等等一类的对象。

1
2
3
4
NSString *string = @”dddd";
NSString *stringCopy = [string copy];
NSMutableString *stringDCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];

查看内存可以发现,string和stringCopy指向的是同一块内存区域(weak reference),引用计数没有发生改变。而stringMCopy则是我们所说的真正意义上的复制,系统为其分配了新内存,是两个独立的字符串内容是一样的。

拷贝构造:

当然在 ios 中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying协议的类可以发送copy消息,遵守NSMutableCopying协议的类才可以发送mutableCopy消息。

假如发送了一个没有遵守上诉两协议而发送copy或者 mutableCopy,那么就会发生异常。但是默认的ios类并没有遵守这两个协议。如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法,如果想自定义一下mutableCopy 那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法。

如果是我们定义的对象,那么我们自己要实现NSCopying , NSMutableCopying这样就能调用copy和mutablecopy了。举个例子:

1
2
3
4
5
6
7
8
@interface MyObj : NSObject<NSCopying, NSMutableCopying>{
    NSMutableString *_name;
    NSString * _imutableStr ;
    int _age;
}     
@property (nonatomic, retain) NSMutableString *name;
@property (nonatomic, retain) NSString *imutableStr;
@property (nonatomic) int age;

copy拷贝构造:

1
2
3
4
5
6
7
- (id)copyWithZone:(NSZone *)zone{
    MyObj *copy = [[[self class] allocWithZone :zone] init];
    copy->name = [_name copy];
    copy->imutableStr = [_imutableStr copy];
    copy->age = age;
    return copy;
}

mutableCopy拷贝构造:

1
2
3
4
5
6
- (id)mutableCopyWithZone:(NSZone *)zone{
    MyObj *copy = NSCopyObject(self, 0, zone);
    copy->name = [_name mutableCopy];
    copy->age = age;
    return copy;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Objective-C学习之路-由浅入深

一、Objective-C简介Objective-C 简称OC /Obj-c Objective 是面向对象的,OC是在C语言的基础上添加了一些新的面向对象的语法,比较繁琐的语法封装的更为简单,所以...
  • qq_33750826
  • qq_33750826
  • 2017年02月09日 16:18
  • 1921

黑马程序员——为什么 Objective-C 很难——黑马 ios 技术博客

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 语法: 首先我们谈谈神马叫做编程语言,编程语言是一种让人们能读懂并且能够展现...
  • dumengqiu
  • dumengqiu
  • 2014年12月02日 14:16
  • 501

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

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

使用Xcode工具开发Objective-C程序

1.启动X-code,单击屏幕顶端的File➡️New➡️Project,或者直接点击页面中的Create a new Xcode project, X-code将会弹出如下图所示的新建项目的对话框...
  • tangjun201
  • tangjun201
  • 2015年05月04日 20:50
  • 603

关于swift与objective-c混合使用

详细的swift与objective-c混合使用文档,图解按步说明。
  • xuanwenchao
  • xuanwenchao
  • 2014年06月12日 12:05
  • 3554

iOS开发应该选择Objective-C还是Swift

iOS开发应该选择Objective-C还是Swift,这里会给出你选择:1.如果你想成为一个iOS开发者,你仍然需要学习Objective-C。2.Objective-C比Swift更容易学习。3....
  • qq_31389903
  • qq_31389903
  • 2016年04月08日 08:18
  • 1748

iOS面试题系列之Objective-C相关

1、简述你项目中常用的设计模式。它们有什么优缺点?常用的设计模式有:代理、观察者、单例。(1)单例:它是用来限制一个类只能创建一个对象。这个对象中的属性可以存储全局共享的数据。所有的类都能访问、设置此...
  • yangshebing21
  • yangshebing21
  • 2016年05月02日 00:33
  • 5118

[精通Objective-C]类,接口,协议与扩展

[精通Objective-C]类,接口,协议与扩展参考书籍:《精通Objective-C》【美】 Keith Lee目录精通Objective-C类接口协议与扩展 目录 类 类的接口 类的实现 实例变...
  • sps900608
  • sps900608
  • 2016年06月29日 16:36
  • 1392

在objective-c中实现模板方法模式(template method)

在ios中实现模板方法(template method)模式
  • kyfxbl
  • kyfxbl
  • 2013年12月02日 12:49
  • 3386

Objective-C中的同步线程的锁

概述在多线程编程中往往会遇到多个线程同时访问共享的资源,这种情况我们需要通过同步线程来避免。也就是给线程加锁。 因为Objective-C是C语言的超集。,严格的来说是真超集。所以C语言当中的pth...
  • GGGHub
  • GGGHub
  • 2016年05月09日 16:01
  • 3123
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C中的浅拷贝和深拷贝
举报原因:
原因补充:

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