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