MST

星途 面试题库

面试题:Objective-C中@dynamic属性在常规类中的实现步骤是怎样的

在Objective-C中,当你在一个类中使用@dynamic声明一个属性时,请简述实现该属性通常需要经过哪些步骤,并且说明与@synthesize声明属性的主要区别。
16.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

使用@dynamic声明属性的实现步骤

  1. 声明属性:在类的接口部分使用@property声明属性,然后在类的实现部分使用@dynamic关键字来告诉编译器,属性的存取方法将由开发者手动提供,而不是由编译器自动合成。
  2. 手动实现存取方法:由于编译器不会自动合成存取方法,所以需要在类的实现文件中手动实现属性的gettersetter方法(如果属性是可读写的)。例如:
- (NSString *)myProperty {
    // 返回属性值的逻辑
    return _myProperty;
}

- (void)setMyProperty:(NSString *)newValue {
    // 设置属性值的逻辑
    _myProperty = newValue;
}

@dynamic与@synthesize声明属性的主要区别

  1. 存取方法合成方式
    • @synthesize:编译器会自动为属性合成gettersetter方法(如果属性是可读写的)。如果属性声明了nonatomic,合成的存取方法是非原子性的;如果未声明,默认是原子性的。同时,如果没有手动声明实例变量,编译器还会自动合成一个以下划线_开头的与属性同名的实例变量。
    • @dynamic:编译器不会自动合成存取方法,需要开发者手动实现。这在一些情况下很有用,比如属性值是从其他复杂数据源获取,或者存取方法需要特殊的实现逻辑。
  2. 应用场景
    • @synthesize:适用于大多数简单的属性,其存取方法不需要特殊逻辑,通过编译器自动合成即可满足需求,提高开发效率。
    • @dynamic:适用于存取方法需要复杂逻辑实现,或者属性值的获取和设置依赖于特殊的机制(如运行时动态解析)的场景。例如,Core Data框架中的托管对象属性通常使用@dynamic声明,因为其属性值的存取是通过Core Data框架的机制来实现的,而不是简单的实例变量读写。