美文网首页
strong和copy的区别

strong和copy的区别

作者: wjam小涛涛 | 来源:发表于2017-12-24 22:29 被阅读25次

    之前在开发的过程中,对定义类的属性用stong还是copy总是有一点迷惑,现在结合代码来巩固一下认知。
    定一一个Person类,类中定义两个属性,分别用stongcopy修饰。

    #import <Foundation/Foundation.h>
    @interface Person : NSObject
    
    @property (nonatomic, strong) NSString *strongString;
    @property (nonatomic, copy) NSString *copyString;
    
    @end
    

    在定义一个可变字符串,分别赋值给这两个属性,然后改变可变字符串的值,看看有什么变化。


    先测strong

        Person *person = [[Person alloc] init];
        NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
        person.strongString = name;
        NSLog(@"name没改之前person.name=%@",person.strongString);
        [name setString:@"王武"];
        NSLog(@"name改之后person.name=%@",person.strongString);
        NSLog(@"name=%@,%p",name,&name);
    
    屏幕快照 2017-12-24 下午10.11.21.png

    从输出结果我们可以看到person.strongString的值在name被修改之后烨跟着修改了。根据结果知道person.strongString和name引用同一个内存地址。


    现在测copy

     NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
     person.cpyString = name;
     NSLog(@"name没改之前person.cpyString=%@",person.cpyString);
    [name setString:@"王武"];
     NSLog(@"name改之后person.cpyString=%@",person.cpyString);
     NSLog(@"name=%@,%p",name,&name);
    
    屏幕快照 2017-12-24 下午10.18.21.png
    输出结果是在name没有改变之后,person.cpyString没有改变。所以nameperson.cpyString没有引用同一个内存地址。

    总结

    1. 当原字符串是NSString时,字符串是不可变的,不管是strong还是copy属性的对象,都是指向原对象。
    2. 当原字符串是NSMutableString时,strong属性只是增加了原字符串的引用计数,而copy属性则是对原字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象,且这个Copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。(总结原文地址http://blog.csdn.net/xdrt81y/article/details/63251879)

    相关文章

      网友评论

          本文标题:strong和copy的区别

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