概念
strong
强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的强引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。
当前对象被其他对象引用时,会执行retain操作,引用计数器+1。当retainCount=0时,该对象才会被销毁。
weak
弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 指针置为nil;
当前对象的生命周期不被是否由其他对象引用限制,它本该什么时候销毁就什么时候被销毁。即使它的引用没断,但是当它的生存周期到了时就会被销毁。
内存管理
创建测试类Strong属性:
实例
@interface StrongClass : NSObject
@property(nonatomic,strong)NSString *StrongStr;
@end
定义个strong修饰的属性,将一个可变的字符串赋值给这个属性,得到的结果:
NSMutableString *MutableTestStr = [[NSMutableString alloc]initWithString:@"Mutabletest"];
StrongClass *strong1 = [[StrongClass alloc]init];
strong1.StrongStr = MutableTestStr;
NSLog(@"Mutable Strong.StrongStr :%@",strong1.StrongStr);
[MutableTestStr appendString:@"hahaah"];
NSLog(@"Mutable Strong.StrongStr change:%@",strong1.StrongStr);
打印结果:
2018-01-31 02:56:45.668951+0800 PropertyTest[3248:661376] Mutable Strong.StrongStr :Mutabletest
2018-01-31 02:56:45.669144+0800 PropertyTest[3248:661376] Mutable Strong.StrongStr change:Mutabletesthahaah
结果表明:
strong修饰的属性的值被改变了,本来赋值过去的值被外部的内容改变了。结论就是,strong修饰的内容只是一个指向MutableTestStr内存地址的一个指针,修改MutableTestStr的内容也就会改变strong属性的值。浅拷贝
上述输入的变量是可变的,那么输入不可变的变量呐?
定义个strong修饰的属性,将一个不可变的字符串赋值给这个属性,得到的结果:
NSString *testStr = @"test";
NSLog(@"testStr:%p--%@",testStr,testStr);
StrongClass *Strong = [[StrongClass alloc]init];
Strong.StrongStr = testStr;
NSLog(@"Strong.StrongStr:%p--%@",Strong.StrongStr,Strong.StrongStr);
testStr = @"test1";
NSLog(@"Strong.StrongStr change:%p--%@",Strong.StrongStr,Strong.StrongStr);
NSLog(@"testStr:%p--%@",testStr,testStr);
打印结果:
2018-02-05 12:12:35.753217+0800 PropertyTest[1495:170898] testStr:0x1080a3130--test
2018-02-05 12:12:35.753412+0800 PropertyTest[1495:170898] Strong.StrongStr:0x1080a3130--test
2018-02-05 12:12:35.753544+0800 PropertyTest[1495:170898] Strong.StrongStr change:0x1080a3130--test
2018-02-05 12:12:35.753704+0800 PropertyTest[1495:170898] testStr:0x1080a3150--test1
结果表明:
发现以前的理解有点出入,修正后的答案:
当Strong的属性StrongStr接收到TestStr的值的时候:只做了指针拷贝工作,指向的内存地址是一样的,而当我们重新给TestStr赋值的时候,相当于重新初始化了一个NSString的变量。所以StrongStr的内存地址还是旧的地址,TestStr变成了新的。
结果
Strong修饰的赋值的内容都是浅拷贝,拷贝指针,强引用该变量,当没有任何实例持有这个强引用的时候,这个变量将被释放。
创建测试类Weak属性
实例
内容涉及到深、浅拷贝,需要在另外的开通新的知识点。已埋👉点我