MST

星途 面试题库

面试题:Objective-C 协议中属性声明的特点

在Objective-C的协议(Protocol)中声明属性,与在类中声明属性有哪些不同?请举例说明如何在协议中声明只读属性和读写属性。
27.8万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 在协议中声明属性与在类中声明属性的不同
    • 实现方式
      • 类中声明属性:类中声明的属性会自动生成对应的实例变量(在现代Objective - C中,实例变量是隐式合成的),并且会自动生成存取方法(getter和setter,如果是读写属性)。例如在类Person中声明属性@property (nonatomic, strong) NSString *name;,编译器会自动生成_name实例变量以及name的getter和setter方法(- (NSString *)name;- (void)setName:(NSString *)name;)。
      • 协议中声明属性:协议中声明的属性只是一种规范,并没有真正的实例变量或实际的存取方法实现。遵守该协议的类需要自己实现这些属性对应的存取方法。
    • 访问控制
      • 类中声明属性:可以使用@private@protected@public等关键字来控制实例变量的访问权限。例如@private NSString *privateVar;,只有类本身的方法能访问privateVar
      • 协议中声明属性:协议中的属性没有访问控制的概念,因为协议主要是定义行为规范,遵守协议的类自行决定属性的访问控制。
  2. 在协议中声明只读属性和读写属性的示例
    • 声明只读属性
@protocol MyProtocol <NSObject>
@property (nonatomic, strong, readonly) NSString *readOnlyProperty;
@end
  • 声明读写属性
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) NSString *readWriteProperty;
@end

在遵守协议的类中,例如:

@interface MyClass : NSObject <MyProtocol>
@end

@implementation MyClass
// 只读属性实现
- (NSString *)readOnlyProperty {
    return @"This is a read - only property";
}
// 读写属性实现
- (NSString *)readWriteProperty {
    return _readWriteProperty;
}
- (void)setReadWriteProperty:(NSString *)readWriteProperty {
    _readWriteProperty = readWriteProperty;
}
@end