番外篇
写在前面
- 本文主要因上篇文章 copy修饰NSArray strong修饰NSMutableArray 有感而写。
- 也为解决上篇文章存在的遗留问题
- 首先还是继续申明两个变量
@property (copy, nonatomic) NSString *cStr;
@property (retain, nonatomic) NSString *rStr;
- 在控制器打印结果
// copy 和 retain 的区别
- (void)testCopyAndRetain {
NSString *str = @"笨笨编程";
self.cStr = str;
self.rStr = str;
NSLog(@"\n str = %p,\n cStr = %p,\n rStr = %p", str, self.cStr, self.rStr);
/* 输出结果:
str = 0x106c78070,
cStr = 0x106c78070,
rStr = 0x106c78070
*/
NSMutableString *mStr = [@"可变的笨笨编程" mutableCopy];
self.cStr = mStr;
self.rStr = mStr;
NSLog(@"\n mStr = %p,\n cStr = %p,\n rStr = %p", mStr, self.cStr, self.rStr);
/* 输出结果:
mStr = 0x600000254850,
cStr = 0x60000025dca0,
rStr = 0x600000254850
*/
}
结果
- 不可变类型在使用
copy
和retain
给变量赋值的时候没啥区别,都是浅拷贝。 - 可变类型在使用
copy
时进行深拷贝,retain
时进行浅拷贝。
结论
- copy 属性是创建一个新的对象,对原对象并没有影响。只是新对象引用计数 +1. 换句话说,copy 减少了对上下文的依赖。
- retain 属性进行浅拷贝,两个对象指向同一块内存地址。为防止野指针,对象引用计数 +1。两个对象会一起发生变化。
使用中注意
- 如果对一个 不可变对象 赋值,那么新对象用
copy
和retain
并没有什么区别。 - 如果对一个 可变对象 赋值,新对象随着原对象变化而变化用
retain
;否则用copy
。(实际开发中:通常都是用retain
或者strong
)
是不是有点觉得文中所有的 retain
和 strong
的用法完全相似,那么 retain
和 strong
又有什么区别呢?
网友评论