简单谈谈@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, copy) 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
的set方法- (void)setBoy:(NSObject *)boy
的实现改成了girl = boy
,即把_boy
用girl
替代。已经不存在_boy
这个成员变量了。
网友评论