文档章节

MutableCopy & copy

AmoyAI
 AmoyAI
发布于 2012/12/11 14:05
字数 646
阅读 535
收藏 1

分别遵守<NSCopying>和 <NSMutableCopying>协议,http://blog.csdn.net/tskyfree/article/details/7999620

首先了解深复制,浅复制:

浅复制和深复制是对于包含对象成员的对象而言的。
浅复制:只复制对象本身,对象的成员只复制指针。
深复制:在浅复制的基础上,同时复制对象的成员。

object c中深拷贝 与传统c++深拷贝一样,都是为了生成一个对象的新的副本,然后把成员按照原来的对象附值。

object c 中需要继承协议NSCopying 并实现方法-(id)copyWithZone:(NSZone *)zone;

例子:
@interface DeepCopy : NSObject<NSCopying>
{
    NSString* mName;  
}

.m文件中
- (id)copyWithZone:(NSZone *)zone
{
    DeepCopy* aCopy = [[[self class] allocWithZone:zone]init];
    todo.mName = [self mName];//也可以todo.mName = [[self mName] copy];
    return aCopy;   
}//copyWithZone:(NSZone *)zone

 主函数中测试下:
      DeepCopy *aDeep1 = [[DeepCopy alloc] init];
      aDeep1.mName = @"liurui";

      DeepCopy *aDeep2 = [aDeep1 copy];

经过测试发现:
     1. aDeep1 和 aDeep2的 内存地址是不同的,说明成功拷贝了一个副本;
     2. 继续跟踪内存发现,aDeep1 aDeep2 对象中的属性mName地址是相同的;




例子1(直接在回复框里写的,不保证能直接运行):

@interface A : NSObject {
}

@property (nonatomic, retain) NSString * member;
- (A *) shadowCopy;
- (A *) deepCopy;

@end

@implementation A
@synthesize member;
- (void) dealloc {
    [self.member release];
    [super dealloc];
}

- (A *) shadowCopy {
    A * ret = [A alloc];
    ret.member = self.member;
    return [ret autorelease];
}

- (A *) deepCopy {
    A * ret = [A alloc];
    ret.member = [NSString stringWithString:self.member]; // 这就是本质区别
    return [ret autorelease];
}

@end

例子2://(浅复制)

#import <Foundation/Foundation.h>  
  
int main(int argc, const char * argv[])  
{  
  
    @autoreleasepool {  
          
        NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:  
                                     [NSMutableString stringWithString:@"one"],  
                                     [NSMutableString stringWithString:@"two"],  
                                     [NSMutableString stringWithString:@"three"],  
                                     nil  
                                     ];  
        NSMutableArray *dataArray2;  
        NSMutableString *mStr;  
          
        NSLog(@"dataArray:   ");  
        for(NSString *elem in dataArray)  
            NSLog(@"   %@", elem);  
          
        //执行一个拷贝,然后改变其中的一个字符串(浅复制)  
        dataArray2 = [dataArray mutableCopy];  
          
        //这种方式会同时改变连个数组中的对象  
        mStr = [dataArray objectAtIndex:0];  
        [mStr appendString:@"ONE"];  
                  
        NSLog(@"dataArray:");  
        for(NSString *elem in dataArray)  
            NSLog(@"  %@",elem);  
          
        NSLog(@"dataArray2:");  
        for(NSString *elem in dataArray2)  
            NSLog(@"  %@",elem);  
          
        [dataArray2 release];  
    }  
    return 0;  
}
//上面的例子dataArrary和dataArray2的第一个元素都被改变了.

//下面的例子:(深复制)

//这种方式只会改变一个数组中的对象,而对另外一个没有影响  
            mStr = [NSMutableString stringWithString:[dataArray2 objectAtIndex:0]];  
            [mStr appendString:@"ONE"];  
            [dataArray2 replaceObjectAtIndex:0 withObject:mStr];


下面是StackoverFlow对MutableCopy和Copy的区别的解释:

// ** NSArray **
NSArray *myArray_imu = [NSArray  arrayWithObjects:@"abc", @"def", nil];

// No copy, increments retain count, result is immutable
NSArray *myArray_imuCopy = [myArray_imu copy];

// Copys object, result is mutable 
NSArray *myArray_imuMuta = [myArray_imu mutableCopy];

[myArray_imuCopy release];
[myArray_imuMuta release];

// ** NSMutableArray **
NSMutableArray *myArray_mut = [NSMutableArray arrayWithObjects:@"A", @"B", nil];

// Copys object, result is immutable
NSMutableArray *myArray_mutCopy = [myArray_mut copy];

// Copys object, result is mutable
NSMutableArray *myArray_mutMuta = [myArray_mut mutableCopy];

[myArray_mutCopy release];
[myArray_mutMuta release];



 
 

   // mutableCopy always returns a mutable result.
   // copy always returns an immutable result.
 


//
copy and mutableCopy are defined in different
 protocols (NSCopying and NSMutableCopying, respectively), 
and NSArray conforms to both. mutableCopy is defined
 for NSArray (not just NSMutableArray) and allows you to make a mutable 
copy of an originally immutable array:



本文转载自:

AmoyAI
粉丝 31
博文 59
码字总数 3593
作品 0
朝阳
私信 提问
copy与mutableCopy

一、深拷贝和浅拷贝 深拷贝:对象拷贝 - 直接拷贝内容。 浅拷贝:指针拷贝 - 将指针中的地址值拷贝一份。 二、对于 Copy 与 mutableCopy 的实践 思路:我用四个方案来验证 Copy 与 mutableC...

JlongTian
2016/01/05
38
0
为什么copy不可以修饰可变数组

总结: 1:对于不可变对象,copy都是浅复制,即指针复制。mutableCopy 都是Alloc一个新对象返回。 2:对于可变对象,copy和mutableCopy都是Alloc新对象返回。 3:不论是可变还是不可变对象,...

Ethan-GOGO
2016/10/19
26
0
IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内...

木木情深
2014/02/19
154
0
Objective-C浅拷贝和深拷贝

浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如: char str = (char)malloc(100); char* str2 = str; 浅拷贝只是对对象的简单拷贝,让几个对象共用一片内...

大喵哥
2014/09/20
57
0
iOS开发之深复制和浅复制

非盈利无广告开发者专用网址导航:www.dev666.com 1、概述 对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接拷贝整个对象...

feng_blog
2016/02/24
2K
2

没有更多内容

加载失败,请刷新页面

加载更多

kerberos 常用命令

假定前提 1:你已经知道kerberos是做什么的,有什么用了。 2:操作者叫 zhangsan 常用命令 命令 说明 kdestroy 删除票据 kinit zhangsan {需要密码}获取张三的票据 票据有效期使用的是默认值...

os_m
21分钟前
4
0
64.springboot设置默认值启动线程数量

1.springboot配置线程 1.1 springboot默认启动线程 server.port=9000#配置编码server.tomcat.uri-encoding=UTF-8#最大并发数server.tomcat.max-threads=1000 #接受和处理的最大连接...

20190513
22分钟前
5
0
磁盘存储和文件系统(三)

磁盘存储和文件系统(三) 分区工具fdisk和gdisk 清空分区表,查看分区表 dd if=/dev/zero of=/dev/sdb bs=1 count=2 seek=510fdisk -l /dev/sdb 添加一块硬盘,识别添加的新硬盘 [root@Cent...

hardstudy-win
52分钟前
5
0
为什么Python无法解析此JSON数据? [关闭]

我在文件中有此JSON: { "maps": [ { "id": "blabla", "iscategorical": "0" }, { "id": "blabla", "iscateg......

技术盛宴
54分钟前
4
0
Eclipse更换炫酷黑色主题

https://blog.csdn.net/qq_32293345/article/details/81144831

天涯爪哇岛
58分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部