为什么在声明setter和getter时我不需要为NSDate对象的实例声明一个setter?

时间:2013-10-03 21:25:21

标签: objective-c cocoa-touch cocoa

除了我的dateCreated var之外,我已经为所有的实例变量声明了大书呆子牧场ios编程书和注意到的getter和setter:

#import <Foundation/Foundation.h>

@interface BNRItem : NSObject
{
    NSString *itemName;
    NSString *serialNumber;
    int valueInDollars;
    NSDate *dateCreated;
}

- (id)initWithItemName:(NSString *)name
        valueInDollars:(int)value
          serialNumber:(NSString *)sNumber;

- (void)setItemName:(NSString *)str;
- (NSString *)itemName;

- (void)setSerialNumber:(NSString *)str;
- (NSString *)serialNumber;

- (void)setValueInDollars:(int)i;
- (int)valueInDollars;

- (NSDate *)dateCreated;

@end

NSDate有什么特别之处,它不需要声明一个setter?

同样在我的实现文件中,为什么我能够调用dateCreated并将其存储在指定类型的变量中?

它是如何设定的?或者首先打电话?我确定后台会有一些事情发生。我查看了NSDate对象的信息,但我还是很困惑。

//implementation of the designated initializer

- (id)initWithItemName:(NSString *)name
        valueInDollars:(int)value
          serialNumber:(NSString *)sNumber
{
    //call NSObject's (superclasses) initializer
    self = [super init];

    //give the new instance of bnritem some values for its instance variables
    [self setItemName:name];
    [self setValueInDollars:value];
    [self setSerialNumber:sNumber];
    dateCreated = [[NSDate alloc] init];

    //return the newly intialized object
    return self;
}

在试图匆匆通过这本书后,我决定从头开始花时间,确保在移动之前100%理解所有内容。我真的花了整整一天在这一章,现在这是一个我无法跨越的障碍。

希望你能提供帮助。 亲切的问候

2 个答案:

答案 0 :(得分:5)

NSDate没有什么特别之处。没有setter方法,因为该属性是公开只读的。它的值在内部设置,一次,永不改变。如果你看一下属性的名称,那么就有充分的理由。

你不需要一个二传手。您可以直接设置实例变量。 Setter是一个构造,允许您在实例变量的管理周围添加一些结构(比如验证传入的值)。

答案 1 :(得分:1)

在您的实施BNRItem中,您可以直接访问BNRItem变量。所以dateCreated = [[NSDate alloc] init]是正确的。您不能在BNRItem实现文件之外执行此操作。