关于copy 、mutableCopy 、strong三者间的关系

定义:

1.copy:不可变复制 

2.mutableCopy:可变复制

实现协议:

1.copy:实现NSCopying协议

2.mutableCopy:实现NSMutableCopying协议

副本:

1.copy:

        a.如果是不可变的比如NSString,只复制了指针,并没有创建新的实例,引用计数并没有改变,相当于retain.

        b.如果是可变的 比如NSMutableString, 复制了新的内容,创建了一个新的immutable!!不可变实例。

2.mutableCopy:

           a.如果是不可变的比如NSString, 复制内容,创建新的可变的mutable实例

           b.如果是可变的比如NSMutableString,复制内容,穿件新的mutable!!可变的实例。


copy与strong的区别

两个的区别主要在于setter方法的区别,说到底就是不同修饰符对应不同的setter方法。

@property (strong, nonamatic) NSMutableString *strongString;

@property (copy, nonatomic) NSMutableString *copyString;

- (void)setStrongString:(NSMutableString *)strongString {

       [_strongString release];

       _strongString = [strongString retain];

}


- (void)setCopyString:(NSMutableString *)copyString {

        [_copyString release];

        _copyString = [copyString copy];

}

再举个例子:

@property (strong,nonatomic) NSArray*bookArray1;

@property (copy,nonatomic) NSArray*bookArray2;

NSMutableArray*books = [@[@"book1"] mutableCopy];    

Person *person = [[Person alloc] init];   

 person.bookArray1= books;   

 person.bookArray2= books;   

 [books addObject:@"book2"];

NSLog(@"bookArray1:%@",person.bookArray1);

NSLog(@"bookArray2:%@",person.bookArray2);}

可以看到bookArray1 与可变数组books指向同一块内容区域,books内容改变,所以bookArray1内容也随之改变。

而bookArray2,因为使用copy,在books被改变前其实复制了books的内容到一个新的内容区域里面,后面虽然改变了books但是,由于并不是一块地址,所以并不改变内容。

你可能感兴趣的:(关于copy 、mutableCopy 、strong三者间的关系)