美文网首页object C学习#iOS#HeminWon
你对@synthesize混淆了吗?

你对@synthesize混淆了吗?

作者: 从来吃不胖 | 来源:发表于2016-11-17 23:43 被阅读145次

    简单谈谈@synthesize

    @synthesize是编译器自动生成setter/getter方法的实现(实现实现实现很重要)的关键词。当前开发中使用了@property后,会在.m中自动生成@synthesize 属性名 = _属性名,而不是@property本身帮我们生成setter/getter方法,@property本身只是生成setter/getter方法的声明(声明声明声明很重要)。

    @synthesize 写出来的代码可能会长这样:

    1. @synthesize boy;

    2. @synthesize boy = boy;

    3. @synthesize boy = _boy;

    4. (girl是事先声明好的一个变量)

     @implementation ViewController {
         NSObject *girl;
     }
     @synthesize boy = girl;
    
    1. @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个关键字代码看看。

    1. 在@property 声明的boy,在setter/getter方法中使用NSObject *boy;这个实例变量来赋值与返回。
    2. 同1。
    3. 在@property 声明的boy,在setter/getter方法中使用NSObject * _boy;这个实例变量来赋值与返回。
    4. 在@property 声明的boy,在setter/getter方法中使用NSObject *girl;这个实例变量来赋值与返回。
    5. 在@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
    
    1. @implementation中声明的成员属性 NSObject *boy 和@property声明的boy是否是同一个对象?还存不存在_boy这个实例变量?

      不是,@synthesize已经指定了girl作为setter/getter方法里使用的实例变量,不再自动生成_boy这个实例变量了。

    2. @synthesize boy = girl; 到底是把boy变成了girl,还是把girl变成了boy?

      没有变来变去,因为压根不存在_boy了。是把boy的set方法- (void)setBoy:(NSObject *)boy 的实现改成了girl = boy,即把_boygirl替代。已经不存在_boy这个成员变量了。

    相关文章

      网友评论

      • 独木舟的木:在新的 Xcode 中,如果在头文件中使用了@property关键字,编译器除了会声明变量的getter和setter方法之外,还会增加一个_var的成员变量,并且会在.m文件中实现相应的getter和setter方法。
        从来吃不胖:@独木舟的木 对啊没错的

      本文标题:你对@synthesize混淆了吗?

      本文链接:https://www.haomeiwen.com/subject/qtqoyttx.html