2009-01-08 85 views
17

我无法理解何时使用Objective C 2.0中的属性。看起来你不需要一个原始类型的属性,例如:int,bool,float。这是真的?我看过一些例子显示这些类型的属性,其他的将它们排除在外。例如,在苹果公司的代码示例他们有:对原始类型使用属性

... 
@interface Book : NSObject { 
    // Primary key in the database. 
    NSInteger primaryKey; 
    // Attributes. 
    NSString *title; 
    NSDate *copyright; 
    NSString *author; 

    BOOL hydrated; 
    BOOL dirty; 
    NSData *data; 
} 

@property (assign, nonatomic, readonly) NSInteger primaryKey; 
// The remaining attributes are copied rather than retained because they are value objects. 
@property (copy, nonatomic) NSString *title; 
@property (copy, nonatomic) NSDate *copyright; 
@property (copy, nonatomic) NSString *author; 
... 

Apple SQLite Book List Sample Code

所以你可以看到,他们不使用属性BOOL,但他们对待它拥有遍布实现文件的实例变量,读取数值并设定数值。 在线搜索我已经找到了使用这些类型属性的教程,例如:(@property BOOL flag)。有人能帮我解释一下这个话题吗?谢谢。

回答

34

是的,你应该为原始类型声明一个属性。唯一真正的区别是你应该使用assign(这是默认的,所以你也可以不用),而不是复制或保留。我不能说其余的例子,但它可能直接访问内部实例变量,或者如果它是从另一个类的键值访问编码产生一个访问器(这是一个非常糟糕的形式)。我猜这是前者;如果我不需要特殊的访问器,并且实例变量不在类的外部使用,那么我将直接引用它而不是声明属性。有些人可能会反驳我的看法,但对我来说似乎有点过分。

+0

谢谢Marc.Yeah,我几乎所有的东西都使用了属性,只是通过我的课程进行清理,并确保它是正确的。我在我的问题中添加了指向我提到的Apple示例代码的链接。但似乎他们直接访问它(不通过self.dirty) – Sean 2009-01-08 16:59:04