property strong or weak

概念

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属性

    实例

    


    内容涉及到深、浅拷贝,需要在另外的开通新的知识点。已埋点我

你可能感兴趣的:(property strong or weak)