ARC(Automatic Reference Counting)
是苹果在iOS 5
开始引入的内存管理机制,到今年(2021年)系统已经发布到iOS 15
了,面试仍然会频繁地提问关于MRC(Manual Reference Counting)
的问题,即便新入行的同学们已经开始广泛地使用Swift
,甚至于他们完全没接触过Objective-C
,这玩意儿就是过不去了。
assign&weak
相同
它们都可以用于修饰需要被弱引用
的对象,并不会引起引用计数+1,以此避免循环引用。
不同
-
assign
通常还用于修饰基础数据类型(如NSInteger
、BOOL
等)和C
数据类型(如int
、float
,double
等)。基础数据类型和C
数据类型会被分配到栈上,栈的内存由系统处理,不会造成野指针。 - 使用
weak
关键字修饰的对象,当该对象释放后,指针地址自动释放;而使用assign
关键字修饰的对象释放后,该指针依旧存在,形成野指针。
retain&strong©
相同
三者都用于修饰对象属性,强引用,一般情况下,MRC
下使用retain
,ARC下使用strong
。
不同
-
copy
可以用于修饰block
,因为block
需要从栈区copy
到堆区;在ARC
下,系统会自动执行该操作,因此block
也可以使用strong
修饰。 -
strong
是浅拷贝,新的指针指向相同的内存地址;copy
是深拷贝,会为对象开辟新的内存地址,指针与内存地址均与原对象不同。
注意,引用不可变对象,即使是
copy
,也仅为浅拷贝。