简单谈谈 @synthesize
@synthesize
是编译器自动生成 setter/getter 方法的实现(实现实现实现很重要)的关键词。当前开发中使用了 @property
后,会在 .m 中自动生成 @synthesize 属性名 = _属性名
,而不是 @property
本身帮我们生成 setter/getter 方法,@property
本身只是生成 setter/getter 方法的声明(声明声明声明很重要)。
@synthesize
写出来的代码可能会长这样:
@synthesize boy;
@synthesize boy = boy;
@synthesize boy = _boy;
(girl是事先声明好的一个变量)
@implementation ViewController {
NSObject *girl;
}
@synthesize boy = girl;
-
@synthesize boy = noDeclaredVar;
(noDeclaredVar是指没有声明过,随便打出来的)
上述5个代码都是能够正常使用的。看着有点绕,新手可能看不懂这到底是干嘛的。
简单解释下,@synthesize boy
默认等于 @synthesize boy = boy;
。那么只要理解一种:@synthesize xx = yy;
即可。这个“等式”表明“之前用@property (nonatomic, strong) NSObject *boy;
声明的这个“属性”在 setter/getter 方法中实际使用的实例变量是 yy
,如果 yy
没有手动声明,那么会自动声明为一个实例变量。
补充一点:xx 必须是用
@property
声明过的。
我们对照着上面的5个关键字代码看看。
- 在
@property
声明的boy,在 setter/getter 方法中使用NSObject *boy;
这个实例变量来赋值与返回。 - 同1。
- 在
@property
声明的boy,在 setter/getter 方法中使用NSObject * _boy;
这个实例变量来赋值与返回。 - 在
@property
声明的boy,在 setter/getter 方法中使用NSObject *girl;
这个实例变量来赋值与返回。 - 在
@property
声明的boy,在 setter/getter 方法中使用NSObject * noDeclaredVar;
这个实例变量来赋值与返回。
@synthesize 使用指定的属性实践
@interface ViewController ()
@property (nonatomic, strong) NSObject *boy;
@end
@implementation ViewController {
NSObject *boy;
NSObject *girl;
}
@synthesize boy = girl;
- (void)viewDidLoad {
[super viewDidLoad];
self.boy = [[NSObject alloc] init];
NSLog(@"请问哪个孩子已经出生了?boy : %@ girl : %@", boy, girl);
}
@end
-
@implementation
中声明的成员属性NSObject *boy
和@property
声明的boy是否是同一个对象?还存不存在_boy
这个实例变量?不是,@synthesize已经指定了
girl
作为 setter/getter 方法里使用的实例变量,不再自动生成_boy
这个实例变量了。 -
@synthesize boy = girl;
到底是把 boy 变成了 girl ,还是把 girl 变成了boy?没有变来变去,因为压根不存在
_boy
了。是把boy
的 setter 方法- (void)setBoy:(NSObject *)boy
的实现改成了girl = boy
,即把_boy
用girl
替代。已经不存在_boy
这个成员变量了。