【IPHONE开发-OBJECTC入门学习】复制对象,深浅复制
2013-06-07 11:59
309 查看
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableArray* arr1 = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5", nil]; //使用retain得到对象所有权,arr1的引用计数加1后为2 NSMutableArray* arr2 = [arr1 retain]; NSLog(@"arr1当前引用计数:%ld",arr1.retainCount); NSLog(@"arr2当前引用计数:%ld",arr2.retainCount); NSLog(@"arr1数组元素:%@",arr1); NSLog(@"arr2数组元素:%@",arr2); NSLog(@"删除arr2最后一个元素,观察arr1和arr2的元素"); [arr2 removeLastObject]; NSLog(@"arr1数组元素:%@",arr1); NSLog(@"arr2数组元素:%@",arr2); //使用Copy返回不可变的对象 NSMutableArray* arr3 = [arr1 copy]; //[arr3 removeLastObject]; 错误写法,因为Copy返回的是不可变对象,因此不能对对象进行修改删除元素操作 NSLog(@"arr1数组元素:%@\t%p",arr1,arr1); NSLog(@"arr3数组元素:%@\t%p",arr3,arr3); //使用MutaleCopy返回可变的对象 NSMutableArray* arr4 = [arr1 mutableCopy]; [arr4 removeLastObject]; //可变的对象可以进行删除修改操作 NSLog(@"arr1数组元素:%@\t%p",arr1,arr1); NSLog(@"arr4数组元素:%@\t%p",arr4,arr4); NSArray* abc = [[NSArray alloc]initWithObjects:@"111",@"222", nil]; NSArray* def = [abc copy]; NSLog(@"abc 的地址:%p",abc); NSLog(@"def 的地址:%p",def); /* 复制对象总结: 1.Foundation框架中的可复制对象,通过上面的代码``得到结论: 当对不可变的对象调用Copy时,实际上并未产生新的对象,还是指向原来的对象的内存空间,作用相当于retain 2.只要满足:被拷贝的对象是可变的或调用的方法是MutableCopy方法,那么产生的对象就是一个新的对象,这是就和retain不一样了 2.retain 方法返回的只是原对象的引用,并未产生一个新的对象,新的对象引用指向了原对象引用指向的同一个内存空间. 3.Copy 方法返回的对象是一个不可变对象 4.MutableCopy 方法返回的对象是一个可变的对象 5.无论原对象是可变的还是不可变的,使用Copy方法得到的新对象都是不可变的 6.无论原对象是可变的还是不可变的,使用MutableCopy方法得到的新对象都是可变的 */ //测试Foundation框架中支持拷贝的对象是浅拷贝还是深拷贝 NSMutableArray* test = [[NSMutableArray alloc]init]; for (int i = 0;i < 3; i++) { NSObject* obj = [[NSObject alloc]init]; [test addObject:obj]; [obj release]; } NSLog(@"拷贝之前:test\n\n"); for (NSObject* obj in test) { NSLog(@"%@\t%p\t%ld",obj,obj,obj.retainCount); } NSMutableArray* result = [test copy]; NSLog(@"拷贝之后:test\n\n"); for (NSObject* obj in test) { NSLog(@"%@\t%p\t%ld",obj,obj,obj.retainCount); } NSLog(@"拷贝之后:result\n\n"); for (NSObject* obj in result) { NSLog(@"%@\t%p\t%ld",obj,obj,obj.retainCount); } /* 深浅复制对象总结: 1.Foundation框架中复制的类,默认是浅复制. 2.浅复制只复制对象本身,对象里所包含的属性,包含的对象不复制,换言之原对象和新对象的包含的属性或对象都指向同一个内存空间. 2.深复制既复制对象本身,对象里所包含的属性,包含的对象也复制,换言之原对象和新对象所包含的属性或对象完全不相同,指向了2个不同的内存空间. */ /* 自定义对象的复制总结: 1.对象要拥有拷贝特性,需要实现NSCopying或NSMutableCopying协议,并实现协议所对应的copyWithZone:方法或mutableCopyWithZone:方法 2.NSCopying和NSMutableCopying可只实现其中一个,或2个都实现 3.NSCopying 实现返回的对象是不可变的 4.NSMutableCopying 实现返回的对象是可变的 5.浅复制标准实现写法如下: - (id) copyWithZone:(NSZone*) zone { Person* p = [[[self class] allocWithZone:zone] init]; p.name = name; p.age = age; return p; } - (id) mutableCopyWithZone:(NSZone*) zone { Person* p = [[[self class] allocWithZone:zone] init]; p.name = name; p.age = age; return p; } 6.深复制标准写法如下: - (id) copyWithZone:(NSZone*) zone { Person* p = [[[self class] allocWithZone:zone] init]; p.name = [name copy]; p.age = [age copy]; return p; } - (id) mutableCopyWithZone:(NSZone*) zone { Person* p = [[[self class] allocWithZone:zone] init]; p.name = [name MutableCopy]; p.age = [age copy]; return p; } */ } return 0; }
相关文章推荐
- 【IPHONE开发-OBJECTC入门学习】复制对象,深浅复制
- 【IPHONE开发-OBJECTC入门学习】复制对象,深浅复制
- 【IPHONE开发-OBJECTC入门学习】文件的操作,读写复制文件
- 【IPHONE开发-OBJECTC入门学习】单例对象设计模式
- 【IPHONE开发-OBJECTC入门学习】对象的归档和解归档
- 【IPHONE开发-OBJECTC入门学习】文件的操作,读写复制文件
- 【IPHONE开发-OBJECTC入门学习】对象的归档和解归档
- 【IPHONE开发-OBJECTC入门学习】单例对象设计模式
- 【IPHONE开发-OBJECTC入门学习】文件的操作,读写复制文件
- 【IPHONE开发-OBJECTC入门学习】对象的归档和解归档
- 【IPHONE开发-OBJECTC入门学习】基本数据类型
- 【IPHONE开发-OBJECTC入门学习】基本数据类型
- 【IPHONE开发-OBJECTC入门学习】NSUserDefaults使用
- 【IPHONE开发-OBJECTC入门学习】NSUserDefaults使用
- iPhone开发入门系列1(iOS8+Swift版)天天打靶APP学习12-14
- 【IOS 开发学习总结-OC-27】★★objective-c之foundation 框架——对象复制
- IOS开发学习笔记(一)——ObjectC语言快速入门
- iPhone开发入门系列1(iOS8+Swift版)天天打靶APP学习10-11
- iPhone开发入门系列1(iOS8+Swift版)天天打靶APP学习03-06
- iPhone入门开发系列2备忘录APP学习03--table view