面试题答案
一键面试- 区别:
- @synthesize:
- 作用是告诉编译器自动生成访问器方法(getter和setter)的实现代码。当我们在类的实现文件中使用
@synthesize
声明一个属性时,编译器会根据属性的声明特性(如nonatomic
、readonly
等)来生成对应的访问器方法。如果属性声明为readwrite
,会生成getter和setter方法;如果是readonly
,只会生成getter方法。
- 作用是告诉编译器自动生成访问器方法(getter和setter)的实现代码。当我们在类的实现文件中使用
- @dynamic:
- 作用是告诉编译器,属性的访问器方法由开发者自己提供或者由运行时动态生成,编译器不会自动生成访问器方法。这意味着如果使用
@dynamic
声明属性,在调用该属性的访问器方法时,编译器不会报错,但如果运行时没有提供相应的实现,程序会崩溃。
- 作用是告诉编译器,属性的访问器方法由开发者自己提供或者由运行时动态生成,编译器不会自动生成访问器方法。这意味着如果使用
- @synthesize:
- 使用场景示例:
- @synthesize:
- 一般的普通属性场景都适用。例如,定义一个简单的
Person
类,有一个name
属性:
- 一般的普通属性场景都适用。例如,定义一个简单的
- @synthesize:
@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
:
- 场景一:在Core Data中使用。当使用Core Data框架时,实体类的属性是动态生成的。例如,有一个
@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
,我们可以完全自定义属性的访问逻辑。