1.浅复制
浅复制只复制对象本身,对象里的属性、包含的对象不做复制 深复制复制全部,包括对象的属性和其他对象Foundation框架支持复制的类,默认是浅复制
NSMutableArray *array=[[NSMutableArray alloc] init];
NSLog(@"数组的地址为 %p",array);
for(int i=0;i<3;i++)
{
NSObject *obj=[[NSObject alloc] init];
[array addObject:obj];
}
for(NSObject *obj1 in array)
{
NSLog(@"地址为 %p",obj1);
}
NSMutableArray *array2=[array copy];
for(NSObject *obj2 in array2)
{
NSLog(@"地址为 %p",obj2);
}
NSLog(@"数组的地址为 %p",array2);
NSString * str1 = [[NSMutableString alloc]init];
NSLog(@"字符串的地址是 %p",str1);
NSString * str2 = [str1 copy];
NSLog(@"字符串深复制的地址是 %p",str2);
NSString * str3 = str1;
NSLog(@"字符串浅复制的地址是 %p",str3)
从打印结果可以看出
a、对于数组,浅复制的话只复制了数组的地址,而数组里面的元素仍未复制,如果想要复制里面的元素,则需要实现深复制;
b、对于字符串,浅复制的话只是增加了对字符串地址的引用,计数器+1,深复制对字符串进行了重新开辟了空间,地址变化
NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil];
NSMutableArray *array1=[array copy];
//array1的地址跟array地址一样,相当于浅复制
[array1 addObject:@"three"];
//这里执行错误
NSMutableArray *array2=[array mutableCopy];
// array2的地址跟array地址不一样
[array2 addObject:@"three"];
//执行正确
NSMutableArray * array3 =[[NSMutableArray alloc] init];
NSLog(@"地址为 %p",array3);
NSMutableArray * array4 = [array3 copy];
NSLog(@"地址为 %p",array4);
a、copy返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本
b、array1地址与array地址一样,是因为Foundation对于copy不可变(NSArray,NSString之类)对象而言,默认都是浅拷贝,相当于retain,当然此时用mutableCopy相当于copy功能
同样,对于可变对象进行copy操作时,相当于copy而非retain,此时copy的对象不可变,如果需要可变则mutableCopy
c、array2地址与array地址不一样,相当于实现了数组的复制功能,当然如果需要对里面的元素进行复制,需要实现深度复制
2.深复制
对象拥有深复制特性,必须实现NSCopying,NSMutableCopying协议,实现该协议的copyWithZone方法和mutableCopyWithZone方法深拷贝和浅拷贝的区别就在于copyWithZone方法的实现
@interface Person : NSObject<NSMutableCopying>
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *age;
@end
@implementation Person
- (id)mutableCopyWithZone:(NSZone *)zone
{
Person *person=[[self class] allocWithZone:zone];
person.age=[_age mutableCopy];
person.name=[_age mutableCopy];
return person;
}
@end
Person *person=[[Person alloc] init];
person.name=@"andy";
person.age=@"20";
Person *person2=[person copy];
NSLog(@"地址为 %p",person);
NSLog(@"地址为 %p",person2);
NSLog(@"地址为 %p",person.name);
NSLog(@"地址为 %p",person2.name);
NSMutableArray * array2 = [[NSMutableArray alloc] initWithArray:array1 copyItems:YES];
打印出来结果是不仅仅复制了person地址,person中的对象地址也进行了复制
实现数组的深度复制,复制的不仅仅是数组本身,数组中的元素也被复制
分享到:
相关推荐
在iOS开发中,Block是一种强大的、灵活的编程结构,它允许你在代码中定义小型的、可重用的代码块,可以当作参数传递,也可以作为返回值。本文将深入探讨Block的概念,以及如何在iOS开发中有效地使用它们。我们将会...
"iOS应用源码——颜色拾取工具.zip"这个标题表明这是一个关于iOS平台的源代码项目,特别是一个实现颜色选取功能的应用。颜色拾取工具通常用于帮助开发者或者设计师从屏幕上选取任何位置的颜色,并提供对应的色彩代码...
这个源码示例——"IOS应用源码——NSFileManager_DirectoryLocations.rar" 很可能包含了如何使用`NSFileManager`查找和操作不同类型的目录位置的代码。下面,我们将深入探讨`NSFileManager`和iOS中的目录位置。 `...
源码的分析与学习将有助于深入理解iOS开发中的UI设计和事件处理机制。 1. **UIActionSheet替代**:在iOS 8之后,UIActionSheet被弃用,OGActionChooser作为其替代品,提供了类似的界面效果和交互体验。它允许开发者...
《iOS应用源码——RichText》 iOS应用开发是一个复杂且充满挑战的过程,尤其是在涉及到文本处理时。在iOS中,富文本(RichText)是指能够包含多种格式的文本,如字体、颜色、大小、对齐方式等。这个名为"RichText...
这个"IOS应用源码——动画.rar"压缩包很可能是包含了一个或多个示例项目,用于演示如何在iOS应用程序中实现各种类型的动画。通过研究这些源码,开发者可以学习到如何在Swift或Objective-C中运用Apple的UIKit框架来...
这个"IOS应用源码——图片倒影效果.zip"文件包含了一个实现这一功能的示例代码,让我们来深入探讨一下相关知识点。 首先,我们需要理解的是,iOS应用程序中的图像处理主要依赖于UIKit框架,尤其是UIImageView类。...
在iOS应用开发中,源码是理解应用程序工作原理和学习技术细节的关键。"Untitled.rar"这个压缩包很可能是包含了一个iOS应用的完整源代码。在深入探讨这些源码之前,我们先来了解一下iOS应用的基本结构和开发环境。 ...
《iOS应用源码详解——Rieyamane Janken项目》 在iOS开发的世界中,源码是开发者学习和理解应用程序工作原理的重要工具。本文将深入探讨“Rieyamane Janken”项目的源码,这是一个基于Swift语言的iOS应用,主要实现...
1. **FileManager**: iOS中的文件管理器类,可以用来创建、删除、复制、移动和检查文件或目录。 2. **NSData**: 对于二进制数据的处理,可以将数据写入文件,或者从文件中读取数据。 3. **NSString**: 提供了读写...
这个压缩包"IOS应用源码——13种非常酷的Core Animation demos.zip"包含了一系列的示例,可以帮助开发者深入了解并掌握Core Animation的核心概念和用法。 首先,Core Animation是Apple的图形渲染框架,它负责在iOS...
【iOS游戏应用源代码——rauluranga-TotemBalance.zip】是一款专为iOS平台开发的游戏应用程序的源代码。此代码库可能包含了实现TotemBalance游戏的所有必要组件,包括图形界面、逻辑处理、用户交互以及可能的游戏...
通过这个源码,开发者可以学习如何扩展和映射数据,以及如何实现平滑的滚动效果,这些都是在iOS开发中处理大型数据集时非常实用的技巧。同时,这也展示了如何利用UIPickerView的现有功能进行创新,创造出独特的用户...
《iOS实例开发源码——gaudiramone-Navidad2-08aeddc》 这个压缩包中的内容是关于iOS应用开发的一个实例项目,名为"Navidad2",由开发者gaudiramone创建并维护。从项目名可以推测,这可能是一个与圣诞节相关的应用...
对于想要学习iOS开发,特别是希望深入理解Google API集成和文字编辑功能的人来说,这是一个宝贵的资源。通过研究这个源码,开发者可以了解如何在实际项目中实现类似的功能,并从中获得灵感和最佳实践。
总之,通过分析这个压缩包,我们可以预期学习到如何在iOS应用中创建自定义的可复制表格视图单元格,使用Swift编程,理解UITableView和UITableViewCell的工作原理,以及如何利用UIPasteboard进行数据复制。...
该压缩包文件“iOS实例开发源码——LucasTizma-Hebi-v1.0-1-g3b4e198.zip”是针对iOS平台的一个实例开发项目,名为“LucasTizma-Hebi”。从版本号v1.0-1-g3b4e198可以看出,这可能是该项目的首个版本,其中“g3b4e...
本篇文章将聚焦于Xcode的一个特定组件——iOS11.1 DeveloperDiskImage,详细探讨其功能、用途以及如何在实际开发过程中进行真机测试。 首先,我们要理解“DeveloperDiskImage”的概念。DeveloperDiskImage是Xcode...
在iOS开发中,NSFileManager还提供了许多其他功能,如移动、复制、删除文件,检查文件或目录是否存在,获取文件属性等。例如,你可以使用`-fileExistsAtPath:`来检查文件是否存在,`-copyItemAtPath:toPath:error:`...
这些标签清楚地指出了本书的目标读者——那些对 Swift 编程语言有一定了解并且希望深入学习 iOS 10 开发技术的开发者。 #### 内容解析 本书的开头部分包含了版权信息、免责声明以及作者的献词。这表明本书是一本...