property 的copy修饰

objective c

经常会在property修饰中看到 copy和strong, 现在来个解释。

首先来看下面代码的输出:

@interface Person : NSObject
@property (strong, nonatomic) NSArray *bookArray1;
@property (copy, nonatomic) NSArray *bookArray2;
@end

@implementation Person
//省略setter方法
@end

//Person调用
main(){
    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);
}

可以看到此刻的person.bookArray1是["book1","book2"],而person.bookArray2是["book1"]。

原因

使用strong修饰符,person.bookArray1就指向books所指向的内存区域,所以与books同变化,而使用copy修饰符,那么person.bookArray2会先新建一个新的内存区域,并将books的数据拷贝过去,所以之后的books变化对person.bookArray2不影响。

根因

  1. strong 修饰的属性在setter 方法中,会首先对bookArray1 release,然后对books retain,最后再把books赋值给bookArray1。
  1. copy修饰的属性在setter方法中,会首先对bookArray release,然后创建一块新内存拷贝books。(深拷贝)

意义

如果property是NSString或者NSArray及其子类的时候,最好选择使用copy属性修饰。这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化,这是不愿看到的。

这里是属性修饰符copy , 还有copy方法和mutableCopy方法,对应的浅拷贝与深拷贝问题可以看这个介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 如何保持农场动物数量平衡一直是农场主所焦虑的事情。三十年前由于担心养殖规模过大而食物供给跟不上,农场主便强制干预公...
    绛草流香阅读 699评论 0 0
  • 到了吃晚饭的时候了,想想什么美食能让我垂涎三尺?没有。原因有: 1.对口腹之欲不大感兴趣,食欲是本性,但与我的意义...
    裸足阅读 156评论 0 0
  • 从小就是个贪睡的孩子,闹铃这种东西对我没什么实际意义,我和“早起”博弈了二十来年从来没有完胜过。近几年我不仅要和“...
    石VV呀阅读 807评论 0 0
  • 投资协议签订前的晚上,一直信誓旦旦的投资人突然变卦,把几千万的投资变成了泡沫,丝毫没有顾忌他和他身后著名的投资机构...
    夔牛神阅读 413评论 0 0