美文网首页
property strong or weak

property strong or weak

作者: struggle3g | 来源:发表于2018-01-31 03:11 被阅读36次

    概念

    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

          本文链接:https://www.haomeiwen.com/subject/ppcxzxtx.html