美文网首页
OC对象复制:2-可变对象与不可变对象复制

OC对象复制:2-可变对象与不可变对象复制

作者: 赵亦晨 | 来源:发表于2016-10-22 01:57 被阅读0次

在Foundation框架中,常用的几个类,如NSString、NSArray以及NSDictionary都有其对应的可变子类。当对不同类的对象进行复制时,系统会采用不同的复制方式,有的采用浅复制,有的采用深复制,因此有必要去提前了解对不同类型的对象进行复制时,得到的拷贝结果是拷贝的指针(浅复制),还是具体的内容(深复制)。

1、拷贝操作(copy与mutableCopy方法)

在NSObject类中提供了两种复制的实例方法,copy和mutableCopy。copy方法,得到的是不可变对象,不管以前的是可变还是不可变。mutableCopy方法,得到的是可变对象,不管以前的是可变还是不可变。

当对不同类型的对象分别使用copy和mutableCopy方法进行复制时,可能对应不同的复制类型(深复制OR浅复制)。

-(id)copy;

-(id)mutableCopy;

2、可变对象与不可变对象

在Foundation框架中,常用的几个不可变的类,如NSString,NSArray,NSDictionary都有对应的可变子类(NSMutableString,NSMutableArray,NSMutableDictionary)。

不可变的类实例化后的对象,分配的内存空间不能再变化,而可变类实例化后的对象,分配的内存可以动态变化。因此,我们可以修改一个可变字符串的内容,或者在一个可变数组中新增/删除其中的对象。

3、容器类与非容器类

容器类就是该类的对象可以用来容纳其他对象,最典型的是数组NSArray以及NSMutableArray。

非容器类的对象不能够容纳其他对象,例如,字符串。

4、非容器类且不可变对象的拷贝

结论:非容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制

示例代码:

voidcopyTest1(){

NSLog(@"非容器类不可变对象复制");

NSString*string=@"宏创学院";

NSString*string1=[stringcopy];

NSString*string2=[stringmutableCopy];

NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSStringclass],string,string1,string2);

NSLog(@"结论:非容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制");

}

运行结果:

5、非容器类且可变对象的拷贝

结论:非容器类可变对象:copy->深复制, mutableCopy->深复制

示例代码:

/**

*  非容器类可变对象复制

*/

voidcopyTest2(){

NSLog(@"非容器类可变对象");

NSMutableString*string=[NSMutableStringstringWithFormat:@"宏创学院"];

NSMutableString*string1=[stringcopy];

NSMutableString*string2=[stringmutableCopy];

NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSMutableStringclass],string,string1,string2);

NSLog(@"结论:非容器类可变对象:copy->深复制, mutableCopy->深复制");

}

运行结果:

6、容器类且不可变对象的拷贝

结论:容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制, 容器内的对象->浅复制

示例代码:

/**

*  容器类不可变对象复制

*/

voidcopyTest3(){

NSLog(@"容器类不可变对象复制");

NSString*string=@"宏创学院";

NSArray*array=[NSArrayarrayWithObjects:string,nil];

NSArray*array1=[array copy];

NSArray*array2=[array mutableCopy];

NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSArrayclass],array,array1,array2);

NSLog(@"string :%p, array[0]: %p, array1[0]: %p, array2[0]: %p",string,array[0],array1[0],array2[0]);

NSLog(@"结论:容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制, 容器内的对象->浅复制");

}

运行结果:

7、容器类且可变对象的拷贝

结论:容器类可变对象:copy->深复制, mutableCopy->深复制, 容器内的对象->浅复制

示例代码:

/**

*  容器类可变对象复制

*/

voidcopyTest4(){

NSLog(@"容器类可变对象复制");

NSMutableString*string=[NSMutableStringstringWithFormat:@"宏创学院"];

NSMutableArray*array=[NSMutableArrayarrayWithObjects:string,nil];

NSMutableArray*array1=[array copy];

NSMutableArray*array2=[array mutableCopy];

NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSMutableArrayclass],array,array1,array2);

NSLog(@"string :%p, array[0]: %p, array1[0]: %p, array2[0]: %p",string,array[0],array1[0],array2[0]);

NSLog(@"结论:容器类可变对象:copy->深复制, mutableCopy->深复制, 容器内的对象->浅复制");

}

运行结果:

相关文章

  • OC对象复制:2-可变对象与不可变对象复制

    在Foundation框架中,常用的几个类,如NSString、NSArray以及NSDictionary都有其对...

  • copy与深浅复制

    不可变对象 copy成 不可变对象是浅复制,其他都是深复制。(不可变对象指NSArray、NSDictionar...

  • copy

    /** 一.系统非容器类对象1.对不可变对象复制:copy是指针复制、mutableCopy是对象复制2.可变对象...

  • 浅拷贝的问题

    内存管理属性retain:浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。copy:对于可变对象...

  • 对象的复制赋值

    目录 潜复制&深复制 值传递&引用传递 可变对象&不可变对象 赋值 对象的赋值实际上是对象的引用。当创建一个对象,...

  • 浅拷贝和深拷贝

    非集合对象 在非集合类对象中,对不可变对象进行copy操作,仅仅是指针复制,是浅复制;对不可变对象进行mutabl...

  • OC-属性修饰符

    OC对象:不可变对象copy是浅拷贝,其他(可变对象的mutablecopy与copy,不可变对象的mutable...

  • 关于copy想说的

    对于不可变对象copy是指针赋值,mutableCopy是对象复制,系统为其开辟新的空间。对于可变对象,copy都...

  • 深拷贝浅拷贝

    1.拷贝可变对象 深拷贝后浅拷贝可变对象,都是内存复制。 输出结果: 2.拷贝不可变对象 浅拷贝是指针拷贝,深拷贝...

  • Python浅复制和深复制的区别

    浅复制 修改不可变对象(str、tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空间 不可变...

网友评论

      本文标题:OC对象复制:2-可变对象与不可变对象复制

      本文链接:https://www.haomeiwen.com/subject/svncuttx.html