@synthesize @dynamic分析

1、子类重写父类属性的get、set方法的两种方法

1.1、使用@synthesize

Person类

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *age;
@property (nonatomic, copy) NSString *sex;

@end

NS_ASSUME_NONNULL_END
#import "Person.h"

@implementation Person

- (NSString *)name {
    _name = @"person change name";
    return _name;
}

@end

Son类

#import "Person.h"

NS_ASSUME_NONNULL_BEGIN

@interface Son : Person

@end

NS_ASSUME_NONNULL_END
#import "Son.h"

@implementation Son

@synthesize name = _name;

- (NSString *)name {
    _name = @"son change name";
    return _name;
}

@end

Son子类重写父类name的get方法时,如果不添加@synthesize,报错信息:Use of undeclared identifier '_name'

1.2、使用@dynamic

#import "Person.h"

NS_ASSUME_NONNULL_BEGIN

@interface Son : Person


@end

NS_ASSUME_NONNULL_END
#import "Son.h"

@implementation Son
{
    NSString *_name;
}
@dynamic name;

- (NSString *)name {
    _name = @"son change name";
    return _name;
}

// 注意:使用dynamic后,必须实现set、get方法。这里没有复写set方法,是因为可以调用父类Person中的set方法。

@end

2、@synthesize

作用:添加一个实例变量名或者别名。同时生成 setter/getter 方法。
iOS 6 之后 LLVM 编译器引入property autosynthesis,即属性自动合成。
即编译器会为每个 @property 属性添加 @synthesize ,
形式:@synthesize propertyName = _propertyName;

3、@dynamic

作用:告诉编译器不自动生成set、get方法。
问题:使用@dynamic name,但没有提供set、get方法,编译通过,运行崩溃。

4、面试题:类中有一个@property name,同时存在名为_name的实例变量,还会自动合成新变量吗?

答:不会。
1、添加name 属性后,编译器会自动添加:@synthesize name = _name;
2、手动添加@synthesize name = _name后,会检查是否存在名为_name变量。不存在则合成_name成员变量,存在则不添加。

推荐阅读更多精彩内容