MST

星途 面试题库

面试题:Objective-C中@synthesize和@dynamic的区别与使用场景

在Objective-C的属性(Property)与合成(Synthesize)机制里,@synthesize和@dynamic指令都有其特定用途,请说明它们的区别,并且分别给出至少一个合适的使用场景示例。
36.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 区别
    • @synthesize
      • 作用是告诉编译器自动生成访问器方法(getter和setter)的实现代码。当我们在类的实现文件中使用@synthesize声明一个属性时,编译器会根据属性的声明特性(如nonatomicreadonly等)来生成对应的访问器方法。如果属性声明为readwrite,会生成getter和setter方法;如果是readonly,只会生成getter方法。
    • @dynamic
      • 作用是告诉编译器,属性的访问器方法由开发者自己提供或者由运行时动态生成,编译器不会自动生成访问器方法。这意味着如果使用@dynamic声明属性,在调用该属性的访问器方法时,编译器不会报错,但如果运行时没有提供相应的实现,程序会崩溃。
  2. 使用场景示例
    • @synthesize
      • 一般的普通属性场景都适用。例如,定义一个简单的Person类,有一个name属性:
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end

@implementation Person
@synthesize name;
@end

这里使用@synthesize name;编译器会自动生成name属性的getter和setter方法。

  • @dynamic
    • 场景一:在Core Data中使用。当使用Core Data框架时,实体类的属性是动态生成的。例如,有一个NSManagedObject子类Book
@interface Book : NSManagedObject
@property (nonatomic, strong) NSString *title;
@end

@implementation Book
@dynamic title;
@end

Core Data会在运行时为title属性动态生成访问器方法。 - 场景二:当需要在运行时动态改变属性的访问逻辑时。比如,我们有一个DynamicPropertyClass类,希望在运行时根据不同的条件来决定属性的取值逻辑:

@interface DynamicPropertyClass : NSObject
@property (nonatomic, assign) NSInteger dynamicValue;
@end

@implementation DynamicPropertyClass
@dynamic dynamicValue;
- (NSInteger)dynamicValue {
    // 根据运行时的条件返回不同的值
    if (someCondition) {
        return 10;
    } else {
        return 20;
    }
}
- (void)setDynamicValue:(NSInteger)newValue {
    // 自定义设置值的逻辑
    //...
}
@end

这里使用@dynamic,我们可以完全自定义属性的访问逻辑。