面试题答案
一键面试可能遇到的问题及解决方法
- 协议定义相关问题
- 命名冲突:不同模块可能定义了相同名称的协议。解决方法是在命名协议时采用具有明确业务含义且唯一的命名,如加上模块名前缀,例如
ModuleNameProtocol
。 - 方法签名不一致:协议中的方法声明与实际实现的方法签名不匹配。在编写协议方法时,仔细确认参数类型、个数和返回值类型,在实现协议方法时,严格按照协议定义编写。
- 命名冲突:不同模块可能定义了相同名称的协议。解决方法是在命名协议时采用具有明确业务含义且唯一的命名,如加上模块名前缀,例如
- 设置代理关系问题
- 代理未设置:视图控制器B没有正确设置视图控制器A为代理,导致数据无法传递。在视图控制器B中,确保在合适的时机(如
viewDidLoad
等方法中)设置代理,例如self.delegate = viewControllerA;
。 - 循环引用:如果视图控制器A对视图控制器B有强引用,同时视图控制器B又对视图控制器A通过代理属性强引用,就会造成循环引用。解决方法是使用
weak
修饰代理属性,打破循环引用。
- 代理未设置:视图控制器B没有正确设置视图控制器A为代理,导致数据无法传递。在视图控制器B中,确保在合适的时机(如
- 数据传递问题
- 代理方法未调用:可能是因为协议方法调用的条件未满足,或者代理方法的实现有误。仔细检查调用代理方法的逻辑,确保条件满足,同时检查代理方法实现中的逻辑是否正确。
- 数据传递错误:传递的数据类型与协议方法定义的不一致。在传递数据时,严格按照协议方法定义的数据类型进行传递。
weak
修饰符在代理属性上的作用
在代理模式中,使用weak
修饰代理属性主要是为了避免循环引用。如果使用strong
修饰代理属性,当代理方(视图控制器A)持有被代理方(视图控制器B)的强引用,同时被代理方又通过代理属性强引用代理方时,就会形成循环引用,导致对象无法正常释放,造成内存泄漏。而weak
修饰的代理属性不会增加对象的引用计数,当代理方对象被释放时,被代理方的代理属性会自动被设置为nil
,从而打破循环引用,确保内存的正常管理。