对Getter和Setter感到困惑

时间:2014-02-18 14:03:36

标签: objective-c getter-setter

我目前正在学习用于iOS编程的Obj-C,但有一些我很困惑的概念。具体来说,是getter和setter访问器。

我正在阅读有关它们的几个不同的东西 - 有些人说它们是在你使用@property时自动创建的,而且不需要手动设置它们,其他人说你需要使用@synthesize。

请参阅以下代码的评论。我对实际手动编码需要的东西以及调用该方法的正确方法感到困惑。

// SomeClass.h    
#import <Foundation/Foundation.h>

@interface SomeClass : NSObject

@property (nonatomic, strong) NSString *firstName;

-(NSString *) firstName;

@end


// SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

// DO I NEED THE CODE BELOW OR ARE THESE AUTO-CREATED?
// ****************************************************
-(NSString *) firstName {
    return _firstName;
}

-(void) setFirstname:(NSString *) newValue {
    _firstName = newValue;
}
// ****************************************************

@end


int main () {

  @autoreleasepool {

    SomeClass *aClass = [[SomeClass alloc] init];

    // How would you set the first name?

    aClass.firstName = @"Richard";    //Does this call setFirstName?

    // OR

    [aClass setFirstName:@"Richard"];

  }



  return 0;
}

1 个答案:

答案 0 :(得分:4)

您正在阅读的一些内容是旧信息。 @synthesize曾经是必需的(并且仍然可以使用),但它现在在编译期间自动添加(你通常应该使用该选项)。

@interface中不需要-(NSString *) firstName;,因为@property定义已经定义了它。

  

//我是否需要以下代码或是否自动创建?

不,你不需要它,它是为你自动生成的。如果你想做一些特别的事情,你只能自己实现这些方法。通常,自动生成的版本很棒,因为您指定了如何在@property定义(nonatomic, strong)中实现这些方法以及它为您做的事情。如果您自己实现这些方法,那么您正在颠覆它(因此@property定义可能会变成谎言......)。

  

aClass.firstName = @“Richard”; //这会调用setFirstName吗?

是的。编译器实际上将其转换为:

[aClass setFirstName:@"Richard"];

给你。