Copy和MutableCopy

//    一: copy 与 retain 的区别

//    谁才有引用计数的概念:

//    1. 堆区空间才有引用计数概念.

//    2. 堆区的对象才会有引用计数.

//%ld: - 1           %lu:18446744073709551615

//retain:始终是浅拷贝。引用计数每次加一。

//返回对象是否可变与被复制的对象保持一致。

//copy:对于可变对象为深拷贝,引用计数不改变;

//对于不可变对象是浅拷贝,引用计数每次加一。

//始终返回一个不可变对象。

//NSString一般建议用copy,这样再更改数据不影响原来的赋值

//mutableCopy:始终是深拷贝,引用计数不改变。

//始终返回一个可变对象。

//    二:浅拷贝与深拷贝的区别

//浅拷贝的定义: 就是复制对象的值的时候,不管复制多少,所以的值都指向同一个对象.

//深拷贝的定义: 增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存.

//浅拷贝 是指针拷贝, 深拷贝 是内容拷贝.

//举例    浅拷贝: 一个人一开始叫张三,后来改名叫李四了,可是还是同一个人.相互影响.

//           深拷贝: 一个人一开始叫张三,后来克隆个人叫李四,不是同一个人.不会相互影响.

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

//    2. 如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法,如果想自定义一下mutableCopy 那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法。

//    三. ios提供了copy和mutablecopy方法,copy就是复制了一个不可变的对象,而mutablecopy就是复制了一个可变的对象.

//1. 对于非容器类对象的拷贝.(NSString, NSNumber等)

//对于一个不可变对象的拷贝:

//   NSString *str1 = [[NSString alloc] initWithFormat:@"bingbingbing"];

//    NSString *str2 = [str1 copy];

//    NSMutableString *str3 = [str1 mutableCopy];

//    NSLog(@"%p, %p, %p", str1, str2, str3);

//    NSLog(@"%lu, %lu, %lu",str1.retainCount, str2.retainCount, str3.retainCount);

//    [str1 release];

//  NSLog(@"%p, %p, %p", str1, str2, str3);

//    NSLog(@"%lu, %lu, %lu",str1.retainCount, str2.retainCount, str3.retainCount);

//如果对一不可变对象复制,copy是浅拷贝, mutableCopy就是深拷贝。

//对于一个可变对象的拷贝:

//    NSMutableString *string1 = [[NSMutableString alloc] initWithFormat:@"冰冰"];

//    NSString *string2 = [string1 mutableCopy];

//    NSMutableString *string3 = [string1 mutableCopy];

//    NSMutableString *string4 = [string1 copy];

//    NSLog(@"%p, %p, %p, %p", string1, string2, string3, string4);

//    NSLog(@"%lu, %lu, %lu, %lu", string1.retainCount, string2.retainCount, string3.retainCount, string4.retainCount);

//如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。

//2. 对容器类对象的拷贝.(NSArray, NSDictionary等)

//

//    NSArray *arr1 = [NSArray arrayWithObjects:@"bing", @"liang", nil];

//    NSArray *arr2 = [arr1 copy];

//    NSMutableArray *arr3 = [arr1 mutableCopy];

//    NSLog(@"%p, %p, %p", arr1, arr2, arr3);

//    NSLog(@"%lu, %lu, %lu", arr1.retainCount, arr2.retainCount, arr3.retainCount);

//arr1是和arr2指向相同的对象,里面的元素也是指向相同的指针,

//这里arr2 是对 arr1 的浅拷贝, arr3 是对 arr1 的深拷贝.

//    for (NSString *p in arr1) {

//        NSLog(@"%p",p);

//    }

//    NSLog(@"_________________________________");

//    for (NSString *p in arr2) {

//        NSLog(@"%p",p);

//    }

//    NSLog(@"_________________________________");

//    for (NSString *p in arr3) {

//        NSLog(@"%p",p);

//    }

//但是数组里的元素都是浅拷贝.

/*

NSMutableString *mutabelString1 = [NSMutableString stringWithFormat:@"bingbing"];

NSMutableString *mutabelString2 = [NSMutableString stringWithFormat:@"laingliang"];

*/

NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"bingbing", @"laingliang", nil];

NSArray *array2 = [array1 copy];

NSMutableArray *array3 = [array1 mutableCopy];

NSMutableArray *array4 = [array1 copy];

NSLog(@"%p, %p, %p, %p", array1, array2, array3, array4);

NSLog(@"%lu, %lu, %lu, %lu", array1.retainCount, array2.retainCount, array3.retainCount, array4.retainCount);

//如果容器的某一元素是不可变的,那你复制完后该对象仍旧是不能改变的,因此只需要指针复制即可。

//        for (NSString *p in array1) {

//            NSLog(@"%p",p);

//        }

//    NSLog(@"_________________________________");

//        for (NSString *p in array2) {

//            NSLog(@"%p",p);

//        }

//    NSLog(@"_________________________________");

//        for (NSString *p in array3) {

//            NSLog(@"%p",p);

//        }

//    NSLog(@"_________________________________");

//       for (NSString *p in array4) {

//            NSLog(@"%p",p);

//    }

//copy 和 retain 的区别 :

//在Foundation对象中,当copy是一个不可变的对象时,作用相当于retain, 都是浅拷贝.

//当是一个 可变对象时, copy 是深拷贝, retain 是浅拷贝.

//copy 和 MutableCopy 的区别 :

//在Foundation对象中,copy是一个不可变的对象时,浅拷贝.

//当我们使用copy一个可变对象时, 深拷贝, 但是副本对象是不可变的.

//当使用mutableCopy时,不管原对象是否可变,副本是可变的,并且实现真正意义上的深拷贝.

//3. 对象的 自定义拷贝:

//深拷贝和浅拷贝的区别就在于copyWithZone方法的实现(略)

// 浅拷贝 复制对象本身,对象里的属性、包含的对象不做复制

// 深拷贝 复制全部,包括对象的属性和其他对象

时间: 2024-10-23 04:07:18

Copy和MutableCopy的相关文章

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方法. 一.指针与对象 在初始学习编程的时候,对于绝大多数面向对象编程的语言,这都是个绕不开的重点与难点.非常惭愧的是对它的认识我一直是不够的,并且感觉这项技术有许多的内容可以挖掘.说这是面向对象编程的核心思想也不为过.很多

深浅拷贝的应用-copy、mutableCopy

ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController //如果想让list成为一个可变的数组,需要把copy变成retain,因为copy之后的对象永远都只是一个不可变的对象 @property (nonatomic,copy)NSMutableArray *list; @end ViewController.m /* 拷贝:复制一个对象->变成另外一个对象 深拷贝:复制

不可变实例、可变实例、copy与mutableCopy

代码: #import <Foundation/Foundation.h> // 不论一个实例是不可变实例还是可变实例 // 通过向该实例发送copy消息,得到的实例是不可变实例 // 通过向该实例发送mutableCopy消息,得到的实例是可变实例 // 在非ARC环境下 // 通过向实例发送copy或mutableCopy消息得到的实例需要手工调用release或autorelease方法 void stringCopy(void); void stringMutableCopy(void