2009-01-08 86 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