iOS开发-------属性用copy、strong修饰的区别
先说明一下什么叫做浅拷贝,什么叫做深拷贝;
浅Copy:可以理解为指针的复制,只是多了一个指向这块内存的指针,共用一块内存。
深Copy:理解为内存的复制,两块内存是完全不同的,也就是两个对象指针分别指向不同的内存,互不干涉。
首先在类延展中声明两个属性变量
- @property (nonatomic, strong)NSString * stringStrong; //strong修饰的字符串对象
- @property (nonatomic, copy)NSString * stringCopy; //copy修饰的字符串对象
接着创建两个不可变字符串(NSString)
- //新创建两个NSString对象
- NSString * strong1 = @"I am Strong!";
- NSString * copy1 = @"I am Copy!";
将两个属性分别进行赋值
- //初始化两个字符串
- 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-29 18:59:06.332 StrongOrCopy[5046:421886] strong1 = 0x10a0b3078
- 2016-02-29 18:59:06.332 StrongOrCopy[5046:421886] stringStrong = 0x10a0b3078
- 2016-02-29 18:59:06.332 StrongOrCopy[5046:421886] copy1 = 0x10a0b3098
- 2016-02-29 18:59:06.332 StrongOrCopy[5046:421886] stringCopy = 0x10a0b3098
如果创建两个不可变字符串对象(NSMutableString)呢
- //新创建两个NSMutableString对象
- NSMutableString * mutableStrong = [NSMutableString stringWithString:@"StrongMutable"];
- NSMutableString * mutableCopy = [NSMutableString stringWithString:@"CopyMutable"];
- self.stringStrong = mutableStrong;
- self.stringCopy = mutableCopy;
分别打印一下四个变量的地址:结果如下:这时就发现了,用strong修饰的字符串依旧进行了浅Copy,而由copy修饰的字符串进行了深Copy,所以mutableStrong与stringStrong指向了同一块内存,而mutableCopy和stringCopy指向的是完全两块不同的内存。
- 2016-02-29 18:59:06.332 StrongOrCopy[5046:421886] mutableStrong = 0x7fccba425d60
- 2016-02-29 18:59:06.332 StrongOrCopy[5046:421886] stringStrong = 0x7fccba425d60
- 2016-02-29 18:59:06.332 StrongOrCopy[5046:421886] mutableCopy = 0x7fccba40d7c0
- 2016-02-29 18:59:06.333 StrongOrCopy[5046:421886] stringCopy = 0x7fccba4149e0
那么有什么用呢,实例来看一下有什么区别:
首先是对不可变字符串进行操作:
- //新创建两个NSString对象
- NSString * strong1 = @"I am Strong!";
- NSString * copy1 = @"I am Copy!";
- //初始化两个字符串
- self.stringStrong = strong1;
- self.stringCopy = copy1;
- //两个NSString进行操作
- [strong1 stringByAppendingString:@"11111"];
- [copy1 stringByAppendingString:@"22222"];
- 2016-02-29 19:15:26.729 StrongOrCopy[5146:439360] strong1 = I am Strong!
- 2016-02-29 19:15:26.729 StrongOrCopy[5146:439360] stringStrong = I am Strong!
- 2016-02-29 19:15:26.729 StrongOrCopy[5146:439360] copy1 = I am Copy!
- 2016-02-29 19:15:26.729 StrongOrCopy[5146:439360] stringCopy = I am Copy!
然后是对可变字符串进行操作:
- //新创建两个NSMutableString对象
- NSMutableString * mutableStrong = [NSMutableString stringWithString:@"StrongMutable"];
- NSMutableString * mutableCopy = [NSMutableString stringWithString:@"CopyMutable"];
- //初始化两个字符串
- self.stringStrong = mutableStrong;
- self.stringCopy = mutableCopy;
- //两个MutableString进行操作
- [mutableStrong appendString:@"Strong!"];
- [mutableCopy appendString:@"Copy!"];
- 2016-02-29 19:20:27.652 StrongOrCopy[5245:446189] stringStrong = StrongMutableStrong!
- 2016-02-29 19:20:27.652 StrongOrCopy[5245:446189] mutableStrong = StrongMutableStrong!
- 2016-02-29 19:20:27.652 StrongOrCopy[5245:446189] stringCopy = CopyMutable
- 2016-02-29 19:20:27.652 StrongOrCopy[5245:446189] mutableCopy = CopyMutableCopy!
这样看来,在不可变对象之间进行转换,strong与copy作用是一样的,但是如果在不可变与可变之间进行操作,那么楼主比较推荐copy,这也就是为什么很多地方用copy,而不是strong修饰NSString,NSArray等存在可变不可变之分的类对象了,避免出现意外的数据操作.