MST

星途 面试题库

面试题:Objective-C代理模式中协议的应用细节

在Objective-C代理模式下,假设你有一个视图控制器A作为代理方,视图控制器B作为被代理方,协议定义了数据传递方法。请详细说明从协议定义、双方设置代理关系到数据传递成功的整个过程中,可能会遇到哪些问题及如何解决,同时说明代理模式中weak修饰符在代理属性上的作用。
45.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

可能遇到的问题及解决方法

  1. 协议定义相关问题
    • 命名冲突:不同模块可能定义了相同名称的协议。解决方法是在命名协议时采用具有明确业务含义且唯一的命名,如加上模块名前缀,例如ModuleNameProtocol
    • 方法签名不一致:协议中的方法声明与实际实现的方法签名不匹配。在编写协议方法时,仔细确认参数类型、个数和返回值类型,在实现协议方法时,严格按照协议定义编写。
  2. 设置代理关系问题
    • 代理未设置:视图控制器B没有正确设置视图控制器A为代理,导致数据无法传递。在视图控制器B中,确保在合适的时机(如viewDidLoad等方法中)设置代理,例如self.delegate = viewControllerA;
    • 循环引用:如果视图控制器A对视图控制器B有强引用,同时视图控制器B又对视图控制器A通过代理属性强引用,就会造成循环引用。解决方法是使用weak修饰代理属性,打破循环引用。
  3. 数据传递问题
    • 代理方法未调用:可能是因为协议方法调用的条件未满足,或者代理方法的实现有误。仔细检查调用代理方法的逻辑,确保条件满足,同时检查代理方法实现中的逻辑是否正确。
    • 数据传递错误:传递的数据类型与协议方法定义的不一致。在传递数据时,严格按照协议方法定义的数据类型进行传递。

weak修饰符在代理属性上的作用

在代理模式中,使用weak修饰代理属性主要是为了避免循环引用。如果使用strong修饰代理属性,当代理方(视图控制器A)持有被代理方(视图控制器B)的强引用,同时被代理方又通过代理属性强引用代理方时,就会形成循环引用,导致对象无法正常释放,造成内存泄漏。而weak修饰的代理属性不会增加对象的引用计数,当代理方对象被释放时,被代理方的代理属性会自动被设置为nil,从而打破循环引用,确保内存的正常管理。