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

Objective c 为什么在声明setter和getter时不需要为NSDate对象的实例声明setter?,objective-c,cocoa-touch,cocoa,Objective C,Cocoa Touch,Cocoa,遵循big nerd ranch ios编程手册,注意到除dateCreated变量外,我的所有实例变量都声明了getter和setter: #import <Foundation/Foundation.h> @interface BNRItem : NSObject { NSString *itemName; NSString *serialNumber; int valueInDollars; NSDate *dateCreated; } -

遵循big nerd ranch ios编程手册,注意到除dateCreated变量外,我的所有实例变量都声明了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
在匆匆读完这本书之后,我决定从无到有,慢慢来,确保在搬家之前我100%地理解了一切。我真的花了一整天的时间在这一章上,现在这是一个我似乎无法跨越的障碍

希望你能帮忙。
亲切问候

日期没有什么特别之处。没有setter方法,因为该属性是公共只读的。它的值在内部设置一次,并且从未更改。如果您查看属性的名称,那么这是一个很好的理由


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

NSDate没有什么特别之处。没有setter方法,因为该属性是公共只读的。它的值在内部设置一次,并且从未更改。如果您查看属性的名称,那么这是一个很好的理由


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

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

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

所以,只有当我需要访问BNRItem文件之外的实例变量时,我才需要使用setter和getter?即使我导入BNRItem文件,由于getter和setter都是在接口中声明的,所以它们是公共的。因此,您可以通过导入BNRItem.h文件在BNRItem外部访问它们。您的变量也在接口中声明,但它们受到保护。只有在您的子类中,您才能直接访问变量。因此,只有当我需要访问BNRItem文件之外的实例变量时,我才需要使用setter和getter?即使我导入BNRItem文件,由于getter和setter都是在接口中声明的,所以它们是公共的。因此,您可以通过导入BNRItem.h文件在BNRItem外部访问它们。您的变量也在接口中声明,但它们受到保护。只有在子类中,才能直接访问变量。dateCreated是只读的,因为我在接口文件中只为它的实例变量声明了一个getter?如果我声明了一个setter,它可以读/写吗?另外,您是说我们使用setter的唯一原因是,在设置实例变量值时,如果我们需要在后台执行更多操作,例如,在设置值之前向其添加100。如果实例变量不需要在后台进行任何管理或其他工作,那么就不需要getter/setter?除非我想访问类之外的变量,在这种情况下,我会创建一个getter?基本上,是的。不仅如此,如果你想在将来证明自己,也要证明自己的意图,证明什么是可编辑的。你应该读一些关于属性的书。从技术上讲,访问器方法不是必需的,它们是明确意图和保护功能的好方法。我更喜欢使用属性,但从本书开始,我还没有遇到一章讨论如何使用它们。这本书提到,在后面的章节中,他们将被介绍。我很高兴我现在已经了解了@properties下面发生的事情。唯一的小问题是我使用的是Xcode5,ios7,这本书更关注Xcode4,ios6。新版本要到12月才会发布,所以我想我接下来会遇到一些问题。你的问题涉及Objective-C,而不是Xcode/iOS版本(这是UI和框架的区别)。访问器方法和属性是语言特性。属性是一种简写形式,用于一次性声明实例变量、访问器方法和访问器方法实现。dateCreated是只读的,因为我在接口文件中只为它的实例变量声明了一个getter?如果我声明了一个setter,它可以读/写吗?另外,您是说我们使用setter的唯一原因是,在设置实例变量值时,如果我们需要在后台执行更多操作,例如,在设置值之前向其添加100。如果实例变量不需要在后台进行任何管理或其他工作,那么就不需要getter/setter?除非我想访问类之外的变量,在这种情况下,我会创建一个getter?基本上,是的。不仅如此,如果你想在将来证明自己,也要证明自己的意图,证明什么是可编辑的。你应该读一些关于属性的书。从技术上讲,访问器方法不是必需的,它们是明确意图和保护功能的好方法。我更喜欢使用属性,但从本书开始,我还没有遇到一章讨论如何使用它们。这本书提到,在后面的章节中,他们将被介绍。我很高兴我现在已经了解了@properties下面发生的事情。唯一的小问题是我使用的是Xcode5,ios7,这本书更关注Xcode4,ios6。新版本要到12月才会发布,所以我想我接下来会遇到一些问题。你的问题涉及Objective-C,而不是Xcode/iOS版本(这是UI和框架的区别)。访问器方法和属性是lan
//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;
}