美文网首页
strong和copy的区别

strong和copy的区别

作者: 楼上那只猫 | 来源:发表于2020-07-09 13:44 被阅读0次

    stong修饰可变类型

    @property(nonatomic, strong) NSMutableArray * arr;
    
    self.arr = [NSMutableArray array];
    NSArray * arr1 = @[@"22", @"33"];
    self.arr = arr1;
    //报错,self.arr指向了不可变数组arr1,不能调用addObject方法
    [self.arr addObject:@"23"];
    

    copy修饰可变类型

    @property(nonatomic, copy) NSMutableArray * arr;
    
    self.arr = [NSMutableArray array];
    NSMutableArray * arr2 = [NSMutableArray arrayWithObjects:@"2", @"222", nil];
    self.arr = arr2;
    //报错,使用copy修饰arr,赋值的时候,会对arr2执行copy,即[arr2 copy],得到的是不可变数组,然后赋值给self.arr,因此此时不能调用addObject方法
    [self.arr addObject:@"23"];
    

    strong修饰不可变类型

    @property(nonatomic, strong) NSArray * arr;
    
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"23", nil];
    //strong修饰arr,将一个可变数组赋值给arr,改变可变数组,arr的值也将改变,这是不可以的。
    self.arr = arr1;
    [arr1 addObject:@"xx"];
    NSLog(@"%@", self.arr);  // [@"23", @"xx"];
    

    copy修饰不可变类型

    @property(nonatomic, copy) NSArray * arr;
    
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"23", nil];
    //arr是不可变的,赋值给了一个可变数组,当可变数组发生改变的时候,属性arr也发生了改变,这与初衷是违背的
    //为了避免这种情况出现,需要用copy修饰该属性。这样在赋值的时候,会对传入的值进行一份深拷贝,arr指向的将是copy后的内存区域
    self.arr = arr1;
    [arr1 addObject:@"xx"];
    NSLog(@"%@", self.arr);
    

    总结如下:
    如果声明的属性是不可变的,那么为了避免在赋值的时候不小心赋值了一个可变的,那么应该用copy修饰这个属性。
    如果声明的属性时可变的,希望赋值后属性值会在后面根据赋值的对象变化而变化,那么应该用strong修饰这个属性。

    相关文章

      网友评论

          本文标题:strong和copy的区别

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