美文网首页
iOS 属性知识之为什么要使用copy特性

iOS 属性知识之为什么要使用copy特性

作者: mzqcreate | 来源:发表于2017-10-24 17:10 被阅读13次

copy特性,传入(赋值)不可变对象时是浅拷贝:

例如,当name属性为copy特质时,str_1赋值操作时浅拷贝

test copy
对象地址没有变

传入可变字符串时是深拷贝:

##用在可变字符串时是深拷贝:##
//属性是iOS管理变量数据存取的方法
@property (nonatomic, strong) NSString *name;

@property (nonatomic, copy) NSString *meng;

@end

@implementation ViewController

-(void)viewDidLoad {
    [super viewDidLoad];
    [self testCopyAndStrong];
    //[self testString];
}

-(void)testCopyAndStrong {
    
    NSMutableString *str = [[NSMutableString alloc] initWithString:@"meng"];
    
    self.meng = str;
    
    self.name = str;
    
    [str appendString:@"zhiqi"];
    
    
    //实际上不可变字符串能拼接是因为它只是用该字符串的副本来拼接
    NSString *str1 = [str1 stringByAppendingString:@"mmm"];
    
    //&打印指针的地址,没有&则是打印指针所指向对象的地址
    NSLog(@"%p, %p", str, &str);
    
    //strong特性,指针地址不同,但是指针所指向对象的地址相同,是浅拷贝(地址拷贝)
    NSLog(@"%p, %p", self.name, &_name);
    
    //copy特性,指针地址不同,指针所指向的对象的地址也不同,是深拷贝(内容拷贝)
    NSLog(@"%p, %p", self.meng, &_meng);
    
    NSLog(@"%@", str);
    //self.name打印出mengzhiqi,可见strong特性只是把指针所指向对象的地址拷贝了
    NSLog(@"%@", self.name);
    NSLog(@"%@", self.meng);
}

-(void)testString {
    
    NSString *str = @"meng";
    self.meng = str;
    self.name = str;
    
    //&打印指针的地址,没有&则是打印指针所指向对象的地址
    NSLog(@"%p, %p", str, &str);
    
    NSLog(@"%p, %p", self.name, &_name);
    
    NSLog(@"%p, %p", self.meng, &_meng);
}

相关文章

网友评论

      本文标题:iOS 属性知识之为什么要使用copy特性

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