copy 和 mutablecopy 笔记

作者:高笑228 | 出处:博客园 | 2012/4/22 14:53:20 | 阅读4次

NSString *a = [[NSString alloc]initWithString:@"hello"];
    NSString *b = [a copy];
    NSLog(@"%d   %d",a.retainCount, b.retainCount);// 2,2
    
    NSMutableString *f = [a mutableCopy];
    
     NSLog(@"%d   %d",a.retainCount, f.retainCount);// 2,1
    
    [f appendString:@"dd"];
    NSLog(@"%@,%@",a,f);// hello,hellodd
    // 对于一个不可变对象来说 copy 是浅copy 只是指针复制 其retainCount 1
    // mutablecopy 是深copy 是对象复制
    
    NSMutableString *c = [[NSMutableString alloc]initWithString:@"hello"];
    NSMutableString *d = [c copy];
    NSLog(@"%d  %d",c.retainCount,d.retainCount);// 1,1
    //  [d appendString:@"ddd"]; //error 因为copy返回一个不可改变对象
    NSMutableString *e = [c mutableCopy];
     NSLog(@"%d  %d",c.retainCount,e.retainCount);// 1,1
    [e appendString:@"dddd"];
    NSLog(@"%@,%@",c,e);// hello,hellodddd
    // 对于可变对象来说 copy 和mutablecopy 都是深copy  都是拷贝对象  不过copy返回的对象是一个不可变对象
    //------------------------------------------------------------//
//    对于系统容器类对象
    
     NSArray *array1 = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
    NSArray *array1Copy = [array1 copy];
    NSLog(@"%d, %d",array1.retainCount,array1Copy.retainCount);//2,2
    NSMutableArray *arrayMcopy = [array1 mutableCopy];
     NSLog(@"%d, %d",array1.retainCount,arrayMcopy.retainCount);//2,1
    [arrayMcopy removeObjectAtIndex:0];
    [arrayMcopy addObject:@"d"];
    NSLog(@"%@-----%@",array1,arrayMcopy);//a,b,c  -----b,c,d
     NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
    NSArray *mArray1copy = [mArray1 copy];
    NSLog(@"%d,%d",mArray1.retainCount,mArray1copy.retainCount);//2,2
    NSMutableArray *mArrayMcopy = [mArray1 mutableCopy];
    NSLog(@"%d,%d",mArray1.retainCount,mArrayMcopy.retainCount);//2,1
    NSMutableString *temp = [mArray1 objectAtIndex:0];
    NSLog(@"%@",temp);//a
    [temp appendString:@"aa"];
    NSLog(@"%@",mArray1);//aaa b c
    NSLog(@"%@",mArray1copy); //aaa b c
    NSLog(@"%@",mArrayMcopy);// aaa b c
    //对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。
    NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
                                  [NSKeyedArchiver archivedDataWithRootObject: mArray1]];
    NSMutableString *temp2 = [trueDeepCopyArray objectAtIndex:0];
    [temp2 appendString:@"aa"];
    
    NSLog(@"%@",mArray1);//aaa b c
    NSLog(@"%@",trueDeepCopyArray);//aaaaa b c
    //trueDeepCopyArray是完全意义上的深拷贝

时间: 2024-08-02 17:21:27

copy 和 mutablecopy 笔记的相关文章

iOS copy 和 mutableCopy 学习

(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢” 或者说”为什么 NSString 类型成员变量的修饰属性用 copy 而不是 strong (或 retain ) ?” 明显 第一句比第二句 严谨多了. @property (strong,nonatomic) NSString *strongString; & @property

Copy和MutableCopy

//    一: copy 与 retain 的区别 //    谁才有引用计数的概念: //    1. 堆区空间才有引用计数概念. //    2. 堆区的对象才会有引用计数. //%ld: - 1           %lu:18446744073709551615 //retain:始终是浅拷贝.引用计数每次加一. //返回对象是否可变与被复制的对象保持一致. //copy:对于可变对象为深拷贝,引用计数不改变; //对于不可变对象是浅拷贝,引用计数每次加一. //始终返回一个不可变对象

copy 和 mutableCopy

retain 和 copy 的区别. copy copy是通过旧对象创建一个新对象,新对象引用计数器为1,与旧对象的引用计数无关. retain retain是创建一个指针,对象引用计数加1.retain 出来的指针和原对象的指针指向的内存地址是相同的. 如何实现copy 并不是所有对象都可以进行copy.mutableCopy .对象如果可以被copy 则需要遵守NSCopying , 如果对象可以被mutableCopying 则需要遵从 NSMutableCopying.如果即可以被cop

Objective-C Objective-C中的指针,及对象的直接指向,copy和mutablecopy

1.Objective-C的指针世界 OC一直是人感觉比较变态的一门语言,为什么呢?因为它的每个变量都是指针型,多的都几乎让人忘了那个*的存在了. 所以常常a=b这个等号让我产生错觉,总以为a从b那拷贝了一份. 然而这的的确确,却是个指针.a这个变量存的内容是b所在的地址. 比如我定义了一个Student的Class,new了stu1和stu2,并把stu2=stu1,那当两者任何一个进行修改时,两个变量的内容都会修改. Student *stu1=[[Student alloc]init];

OC语法——Object-C retain、copy、mutableCopy的详细分析

OC语法中的retain.copy.mutableCopy 大家都基本知道它的基本意思,但是对于mutable类型和immutable类型的处理上有很多童鞋并没有真正测试过,今天就和大家分享下: 1.先来看下immutable类型的非容器类: NSString的retain.copy和mutableCopy的测试 NSString *string = @"abc"; NSString *retainString = [string retain]; NSString *copyStri

Objective-C语法之copy和mutablecopy

#pragma mark 演示字符串的copy //深拷贝--对象拷贝--内容拷贝(产生新对象)新对象计数器+1,原对象不变 void stringmutableCopy(){ //string = 1 NSString *string = [[NSString alloc]initWithFormat:@"age is %i", 10]; //str = 1 //产生了一个新对象,原对象的计数器不变 NSMutableString *str = [string mutableCopy

【OC学习-11】ARC和内存管理里面的alloc、assign、new、retain、copy、mutableCopy、release说明

一般我们在开发程序时,只管alloc,不需要管release,因为有ARC帮我们管理.但是在学习时仍需要了解:内存是有限的,在堆区分配了内存后,如果不需要,则要回收,不然内存不够引起崩溃. 所以原则是:有分配,就有回收.但是这个分配有可能分配好几次,那么回收怎么知道回收几次呢?这就是引用计数的作用.创建一个对象时,它自带了这个引用计数. (1)alloc.new.copy.mutableCopy和retain时,引用计数+1,即retainCount+1; (2)release时,引用计数ret

copy and mutableCopy

结论: 1, 深复制与浅复制 2,immutable和mutable 3,代码分析: #pragma mark - String - (void)stringCopyAndMutableCopy { NSString *originStr = @"123"; NSString *copyStr = [originStr copy];//浅复制 NSString *mutableCopyStr = [originStr mutableCopy];//深复制 NSLog(@"st

关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/不可变对象: 4.Objective-C中的copy与mutableCopy方法. 一.指针与对象 在初始学习编程的时候,对于绝大多数面向对象编程的语言,这都是个绕不开的重点与难点.非常惭愧的是对它的认识我一直是不够的,并且感觉这项技术有许多的内容可以挖掘.说这是面向对象编程的核心思想也不为过.很多