IOS开发之copy与MutableCopy

在开发工程中,很多时候我们要创建对象的副本,要创建副本,对象所在的类必须遵守 NSCopying 和 NSMutableCopying 的协议:

@protocol NSCopying

- (id)copyWithZone:(NSZone *)zone;

@end

@protocol NSMutableCopying

- (id)mutableCopyWithZone:(NSZone *)zone;

@end

一般Foundation的类都遵守这两个协议,都可以直接复制。

复制分多种情况

一:非容器类的不可变对象的复制,copy不产生副本,只有MutableCopy才产生副本。

  1.不可变对象的copy

   copy是一种浅拷贝,只复制对象指针的值,不产生副本,只增加对象的引用计数。 

  NSString * ns1 = [[NSString alloc] initWithFormat:@"%@",@"1234"];
  NSString * copyns1 = [ns1 copy];
  NSLog(@"copy: %lu   %lu",ns1.retainCount,copyns1.retainCount);

  2.不可变对象的MutableCopy

   mutableCopy产生可变对象,也就是一个副本,是一种深拷贝,但不改变原对象的引用计数。

  NSString * ns1 = [[NSString alloc] initWithFormat:@"%@",@"1234"];  NSMutableString * mcns1 = [ns1 mutableCopy];  NSLog(@"%lu  %lu   %lu",ns1.retainCount,copyns1.retainCount,mcns1.retainCount);

二:非容器类的可变对象的复制,不管是copy还是MutableCopy都会产生新的副本。

  1.可变对象的copy

   copy产生一个新的不可变对象。(产生副本)

  NSMutableString * ms1 = [[NSMutableString alloc] initWithFormat:@"%@",@"4567" ];
  NSString* copyms1 = [ms1 copy];
  NSLog(@"muablecopy: %lu  %lu",ms1.retainCount,copyms1.retainCount);

  2.可变对象的MutableCopy

   MutableCopy产生一个新的可变对象。(产生副本)

  NSMutableString * ms1 = [[NSMutableString alloc] initWithFormat:@"%@",@"4567" ];  NSMutableString * mcms1 = [ms1 mutableCopy];  NSLog(@"%lu  %lu   %lu",ms1.retainCount,copyms1.retainCount,mcms1.retainCount);

三 不可变容器类的copy和MutableCopy (容器类的复制默认是浅复制,即只复制容器类对象本身,不复制容器里的对象

 1.copy不产生新的副本,只增加数组本身的引用计数,数组内的对象的引用计数没有增加。

 NSArray *arr1=[NSArray arrayWithObjects:@1,@2,@3,@4,nil];
 NSArray *copyArray=[arr1 copy];
 NSLog(@"%p %p",arr1,copyArray); NSLog(@"%lu %lu",(unsigned long)arr1.retainCount,(unsigned long)copyArray.retainCount);

 2.MutableCopy产生一个副本,是一个可变数组,原数组本身的引用计数没有增加,但数组内的对象的引用计数增加。

NSArray *arr1=[NSArray arrayWithObjects:@1,@2,@3,@4,nil];
NSMutableArray *copyArray=[arr1 mutableCopy];
NSLog(@"%p %p",arr1,copyArray);
NSLog(@"%lu %lu",(unsigned long)arr1.retainCount,(unsigned long)copyArray.retainCount)

四 可变容器类的copy和MutableCopy

1.copy产生一个副本,是不可变的数组,数组内的对象的引用计数增加。

2.MutableCopy也产生一个副本,是可变的数组,数组内的引用计数增加。

关于Copy和MutableCopy的总结:

对于不可变的对象,Copy不产生新对象,其作用就相当于retain,增加引用计数。MutableCopy产生新的可变对象,原对象的引用计数不变。

对于可变对象来说,Copy和MutableCopy都产生副本,也就是新对象,但Copy是不可变的副本,MutableCopy是可变的副本。

关于Copy和MutableCopy结果的总结:

Copy的结果是不可变的,而MutableCopy的结果是可变的。

时间: 2024-10-14 12:00:29

IOS开发之copy与MutableCopy的相关文章

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

李洪强IOS开发之-iOS经典面试题

李洪强IOS开发之-iOS经典面试题 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人.所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充.我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这

【IOS开发之Objective-C】数据持久化--文件和归档

在OC中数据持久化的方式有多种,例如:写入一个文件再或是归档.写入文件的方式我们一般都可以直接读取文件中的数据.比如我把数据写进一个XX.txt文档里面.只有数据写入成功了我就可以直接读取这个文件了.但是这样对于一些用户关键的数据并不能起到保密的作用,如果需要保密还需要使用归档操作. 文件的操作 //首先声明一个字符串 NSString * str1 = @"123456789"; 方式一 直接使用方法: - (BOOL)writeToFile:(NSString *)path ato

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适

iOS开发之CocoaPods的使用

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {           

iOS开发之UILabel

UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: ? 1 2 3 4 5 6 7 8 9 10 /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 40); /*初始化*/ UILabel *titleLabel = [[UILabel alloc] initWithFrame:labelRect]; /*一些属性的设置*/ titleLabel.font = [UIFont systemFontOf

iOS开发之多XIB之间相互关联

Xib link Xib 1.直接加载xib中的UIView 创建一个View1.xib, 随便设一个背景色,加一个标识UILabel, 这样好知道是这个view是哪一个view. 你可以在这个view上加作意的subview,我只是说明原理,所以这儿并没有加作何subview. 最终我的View1如下图: 由于View1会放到其它View上作为subview,所以这儿size是Freeform, Status Bar是:None. 将下面代码放到viewDidLoad中: &1这行代码就是加载

iOS开发之UISearchBar初探

iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开发需求.比如:修改placeholder的颜色.修改UISearchBar上面的UITextfield的背景颜色.修改UITextfield上面的照片等等. 为了实现上述的需求,最好写一个UISearchBar的子类就叫LSSearchBar吧 LSSearchBar.h如下: #import <U