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©

相同

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

不同

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

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

你可能感兴趣的:(iOS八股文——属性修饰(assign, retain, weak, strong, copy))