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成员变量,存在则不添加。
网友评论