iOS开发 -- 属性用copy、strong修饰的区别
copy,strong的区别需要了解点内存管理的知识,strong是arc下引入的修饰,相当于手动管理内存(mrc)下的retain,在相关代码下,常常看到有的人用copy修饰nsstring,nsarray,nsdictionary..等存在可变与不可变之分的对象,常常会用copy,而不是strong,下面代码来解释一下strong与copy的区别:
先说明一下什么叫做浅拷贝,什么叫做深拷贝;
浅copy:可以理解为指针的复制,只是多了一个指向这块内存的指针,共用一块内存。
深copy:理解为内存的复制,两块内存是完全不同的,也就是两个对象指针分别指向不同的内存,互不干涉。
首先在类延展中声明两个属性变量
@property(nonatomic,strong)nsstring*stringstrong;//strong修饰的字符串对象
@property(nonatomic,copy)nsstring*stringcopy;//copy修饰的字符串对象
接着创建两个不可变字符串(nsstring)
//新创建两个nsstring对象
nsstring*strong1=@"iamstrong!";
nsstring*copy1=@"iamcopy!";
将两个属性分别进行赋值
//初始化两个字符串
self.stringstrong=strong1;
self.stringcopy=copy1;
分别打印一下四个变量的内存地址:
nslog(@"strong1=%p",strong1);
nslog(@"stringstrong=%p",self.stringstrong);
nslog(@"copy1=%p",copy1);
nslog(@"stringcopy=%p",self.stringcopy);
结果如下:可以看出,此时无论是strong修饰的字符串还是copy修饰的字符串,都进行了浅copy.
2016-02-2918:59:06.332strongorcopy[5046:421886]strong1=0x10a0b3078
2016-02-2918:59:06.332strongorcopy[5046:421886]stringstrong=0x10a0b3078
2016-02-2918:59:06.332strongorcopy[5046:421886]copy1=0x10a0b3098
2016-02-2918:59:06.332strongorcopy[5046:421886]stringcopy=0x10a0b3098
如果创建两个不可变字符串对象(nsmutablestring)呢
//新创建两个nsmutablestring对象
nsmutablestring*mutablestrong=[nsmutablestringstringwithstring:@"strongmutable"];
nsmutablestring*mutablecopy=[nsmutablestringstringwithstring:@"copymutable"]; 分别对属性再次进行赋
self.stringstrong=mutablestrong;
self.stringcopy=mutablecopy;
分别打印一下四个变量的地址:结果如下:这时就发现了,用strong修饰的字符串依旧进行了浅copy,而由copy修饰的字符串进行了深copy,所以mutablestrong与stringstrong指向了同一块内存,而mutablecopy和stringcopy指向的是完全两块不同的内存。
2016-02-2918:59:06.332strongorcopy[5046:421886]mutablestrong=0x7fccba425d60
2016-02-2918:59:06.332strongorcopy[5046:421886]stringstrong=0x7fccba425d60
2016-02-2918:59:06.332strongorcopy[5046:421886]mutablecopy=0x7fccba40d7c0
2016-02-2918:59:06.333strongorcopy[5046:421886]stringcopy=0x7fccba4149e0
那么有什么用呢,实例来看一下有什么区别:
首先是对不可变字符串进行操作:
[objc]view plaincopy
//新创建两个nsstring对象
nsstring*strong1=@"iamstrong!";
nsstring*copy1=@"iamcopy!";
//初始化两个字符串
self.stringstrong=strong1;
self.stringcopy=copy1;
//两个nsstring进行操作
[strong1stringbyappendingstring:@"11111"];
[copy1stringbyappendingstring:@"22222"]; 分别对在字符串后面进行拼接,当然这个拼接对原字符串没有任何的影响,因为不可变自字符串调用的方法都是有返回值的,原来的值是不会发生变化的.打印如下,对结果没有任何的影响:
2016-02-2919:15:26.729strongorcopy[5146:439360]strong1=iamstrong!
2016-02-2919:15:26.729strongorcopy[5146:439360]stringstrong=iamstrong!
2016-02-2919:15:26.729strongorcopy[5146:439360]copy1=iamcopy!
2016-02-2919:15:26.729strongorcopy[5146:439360]stringcopy=iamcopy!
然后是对可变字符串进行操作:
//新创建两个nsmutablestring对象
nsmutablestring*mutablestrong=[nsmutablestringstringwithstring:@"strongmutable"];
nsmutablestring*mutablecopy=[nsmutablestringstringwithstring:@"copymutable"];
//初始化两个字符串
self.stringstrong=mutablestrong;
self.stringcopy=mutablecopy;
//两个mutablestring进行操作
[mutablestrongappendstring:@"strong!"];
[mutablecopyappendstring:@"copy!"];
再来看一下结果:对mutablestrong进行的操作,由于用strong修饰的stringstrong没有进行深copy,导致共用了一块内存,当mutablestrong对内存进行了操作的时候,实际上对stringstrong也进行了操作; 相反,用copy修饰的stringcopy进行了深copy,也就是说stringcopy与mutablecopy用了两块完全不同的内存,所以不管mutablecopy进行了怎么样的变化,原来的stringcopy都不会发生变化.这就在日常中避免了出现一些不可预计的错误。
2016-02-2919:20:27.652strongorcopy[5245:446189]stringstrong=strongmutablestrong!
2016-02-2919:20:27.652strongorcopy[5245:446189]mutablestrong=strongmutablestrong!
2016-02-2919:20:27.652strongorcopy[5245:446189]stringcopy=copymutable
2016-02-2919:20:27.652strongorcopy[5245:446189]mutablecopy=copymutablecopy!
这样看来,在不可变对象之间进行转换,strong与copy作用是一样的,但是如果在不可变与可变之间进行操作,那么楼主比较推荐copy,这也就是为什么很多地方用copy,而不是strong修饰nsstring,nsarray等存在可变不可变之分的类对象了,避免出现意外的数据操作.
推荐阅读
-
iOS开发 -- 属性用copy、strong修饰的区别
-
iOS 关于copy与mutablecopy的区别、copy与strong的区别
-
字符串修饰符strong和copy的区别
-
IOS开发中的属性readwrite,readonly,retain,assign,copy,nonatomic,strong,weak.
-
IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义
-
iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰
-
iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因
-
iOS 属性修饰符的区别
-
iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰
-
iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因