iOS八股文——属性修饰(assign, retain, weak, strong, copy)

ARC(Automatic Reference Counting)是苹果在iOS 5开始引入的内存管理机制,到今年(2021年)系统已经发布到iOS 15 了,面试仍然会频繁地提问关于MRC(Manual Reference Counting)

的问题,即便新入行的同学们已经开始广泛地使用Swift,甚至于他们完全没接触过Objective-C

,这玩意儿就是过不去了。


assign&weak

相同

它们都可以用于修饰需要被弱引用的对象,并不会引起引用计数+1,以此避免循环引用。

不同

  • assign 通常还用于修饰基础数据类型(如NSIntegerBOOL等)和C数据类型(如intfloatdouble等)。基础数据类型和C数据类型会被分配到栈上,栈的内存由系统处理,不会造成野指针
  • 使用weak关键字修饰的对象,当该对象释放后,指针地址自动释放;而使用assign关键字修饰的对象释放后,该指针依旧存在,形成野指针

retain&strong&copy

相同

三者都用于修饰对象属性,强引用,一般情况下,MRC下使用retain,ARC下使用strong

不同

  • copy可以用于修饰block,因为block需要从栈区copy到堆区;在ARC下,系统会自动执行该操作,因此block也可以使用strong修饰。
  • strong浅拷贝,新的指针指向相同的内存地址;copy深拷贝,会为对象开辟新的内存地址,指针与内存地址均与原对象不同。

注意,引用不可变对象,即使是copy,也仅为浅拷贝

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

推荐阅读更多精彩内容