面试题答案
一键面试strong
- 特点:强引用,持有对象,当对象的强引用计数变为0时,对象才会被释放。
- 适用场景:通常用于一般的对象属性,比如视图控制器中的视图属性等。在视图控制器之间传值,如果接收方需要持有传递过来的对象,就可以用strong。例如,在A视图控制器向B视图控制器传递一个自定义数据模型对象,B视图控制器要在自身生命周期内一直使用该对象,就可以用strong修饰接收的属性。
weak
- 特点:弱引用,不持有对象,不会影响对象的引用计数。当对象被释放时,指向它的弱引用会自动被设置为nil,避免野指针。
- 适用场景:主要用于解决循环引用问题,比如视图控制器之间的父子关系(子视图控制器对父视图控制器的引用)、代理模式中代理对象对被代理对象的引用。在处理视图控制器之间传值,如果接收方不需要持有传递过来的对象,只是临时使用,就可以用weak,比如某个视图控制器作为代理接收另一个视图控制器传递的数据,代理属性用weak。
assign
- 特点:简单赋值,不更改对象的引用计数,一般用于基本数据类型(如NSInteger、CGFloat等)和C数据类型(如int、float等)。对于对象类型使用assign,当对象被释放后,指向它的指针不会自动变为nil,容易产生野指针。
- 适用场景:适用于基本数据类型的属性定义。例如定义一个表示计数器的NSInteger类型的属性,就可以用assign。
copy
- 特点:创建一个新的对象副本,对不可变对象执行copy操作,实际上返回的是原对象(浅拷贝);对可变对象执行copy操作,会创建一个新的不可变对象(深拷贝)。会增加新副本对象的引用计数。
- 适用场景:用于需要确保属性值不会被意外修改的情况,特别是当属性值可能是可变对象时。比如一个视图控制器接收一个字符串属性,为了防止外部对传入的字符串进行修改影响自身逻辑,就可以用copy修饰字符串属性,这样即使外部修改了原字符串,本视图控制器内的字符串不受影响。