@property指示符copy相关知识

近期空闲时间在重新加深OC基础相关方面的学习,这里记录一下属性指示符copy相关知识和引申出来的对象复制等知识。


1、 copy指示符

使用copy指示符修饰的属性赋值时会重新申请一份内存并赋予相同的内容,两个指针指向不同的内存地址。

copy一般用来修饰具有对应可变类型子类的对象。 如:NSString,NSArray和NSDictionary等。 

为确保不可变对象不被可变子类影响,需要完全拷贝一份,如果不使用copy而采用strong等修饰则会因为多态特性导致属性值后续操作被改变。

使用strong修饰
使用copy修饰

通过上面测试就能看出copy指示符的优势及作用所在了。

日常开发中copy还被用来修饰block类型,这主要是因为block类型在MRC环境时默认会被分配在栈区,而栈区的内容不需要程序员管理,系统自动分配并且自动销毁。所以需要使用copy将block拷贝到堆区来防止野指针的错误。

对于可变对象类型,如NSMutableString、NSMutableArray和NSMutableDictionary等则不可以使用copy修饰,因为苹果Foundation框架提供的这些类都实现了NSCopying协议,使用copy方法返回的都是不可变对象,所以对于可变对象使用strong修饰符即可。

2、copy和mutableCopy之对象拷贝

苹果Foundation框架中提供的很多类型已经帮我们实现了上述两个方法,因此我们可以使用copy方法和mutableCopy方法来拷贝一个对象。

对于不可变类型,使用copy方法时是浅拷贝,只拷贝指针,因为内容是不会变化的。使用mutableCopy时由于返回可变对象因此需要一份拷贝,供其他对象使用。对于可变类型,不管是copy还是mutableCopy均会进行深拷贝,所指向指针不同。

3、copy和mutableCopy之自定义对象拷贝

当开发过程中需要拷贝一个自定义对象时,这时我们需要让拷贝的对象遵守NSCopying或NSMutableCopying协议。

然后对应实现copyWithZone:和mutableCopyWithZone:两个方法即可实现。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    iOS菜鸟大大阅读 4,090评论 0 1
  • 前言 不敢说覆盖OC中所有copy的知识点,但最起码是目前最全的最新的一篇关于 copy的技术文档了。后续发现有新...
    zyydeveloper阅读 8,871评论 4 35
  • @property修饰符 atomic nonatomic readwrite readonly retain a...
    SPIREJ阅读 3,471评论 0 1
  • @property介绍 相信做过iOS开发的同学都使用过@property,@property翻译过来是属性。在定...
    子疯zp阅读 4,272评论 0 6
  • http://javahungry.blogspot.com/2015/08/difference-between...
    ilaoke阅读 1,459评论 0 0

友情链接更多精彩内容