MST

星途 面试题库

面试题:Objective-C中协议与委托在运行时的基本关联方式

请阐述Objective-C协议与委托在运行时是如何建立基本关联的?说明协议声明、委托设置以及消息传递的主要步骤。
49.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 协议声明
    • 在Objective - C中,协议使用@protocol关键字声明。例如:
    @protocol MyProtocol <NSObject>
    - (void)someMethod;
    @end
    
    • 协议定义了一组方法签名,遵守该协议的类必须实现这些方法(除非这些方法被标记为可选的,使用@optional关键字)。协议可以继承自其他协议,通过<>语法指定,如<NSObject>NSObject协议定义了一些基础的方法,几乎所有的Objective - C类都直接或间接遵守NSObject协议。
  2. 委托设置
    • 首先,委托类(持有委托属性的类)需要定义一个属性来持有委托对象,并且该属性的类型必须遵守相关协议。例如:
    @interface MyClass : NSObject
    @property (nonatomic, weak) id<MyProtocol> delegate;
    @end
    
    • 然后,在某个地方创建委托对象,并将其赋值给委托属性。比如在另一个类中:
    @interface AnotherClass : NSObject <MyProtocol>
    - (void)setup {
        MyClass *myObject = [[MyClass alloc] init];
        myObject.delegate = self;
    }
    - (void)someMethod {
        NSLog(@"执行了协议方法");
    }
    @end
    
  3. 消息传递
    • 当委托类中的某些事件发生时,它会检查委托是否存在(不为nil),然后调用委托对象上协议定义的方法。例如:
    @implementation MyClass
    - (void)doSomething {
        if ([self.delegate respondsToSelector:@selector(someMethod)]) {
            [self.delegate someMethod];
        }
    }
    @end
    
    • 这里,respondsToSelector:方法用于检查委托对象是否实现了指定的方法。如果实现了,就通过[self.delegate someMethod]调用委托对象的该方法,从而完成消息从委托类到委托对象的传递。