2009-12-01 68 views
0

我一直在通過屏幕錄像here來學習如何編寫基於表格的iPhone應用程序,到目前爲止它一直非常順利。目前我正處於第三集的一半,它開始遇到困難。屬性拒絕合成

爲了移除表格頂層的臨時硬編碼,本教程將爲所有條目及其數據創建NSMutableDicitonary,然後使用forKeys語句創建NSArray以獲取僅包含詞條的數組在表格單元格中顯示。

我遇到的問題是數組的變量拒絕合成。

冒犯性的變量是在AppDelegate.h文件中定義與特性的其餘部分,如下所示:

@property (readonly) NSArray *recipes; 

據然後合成和實施在AppDelegate.m文件如下:

@synthesize recipes; 

- (NSArray *)recipes { 
    return [data allKeys]; 
} 

我詢問了截屏視頻的作者,並且他建議以下內容適用於AppDelegate.h

@class Foo :NSObject { 
    NSArray *_recipes; 
} 

@property(nonatomic, retain)NSArray *recipes; 

@end 

這對於AppDelegate.m

@implementation Foo 

@synthesize recipes = _recipes; 

@end 

這個方法我試過,但比有才創造了更多的錯誤。是什麼讓這個變量定義與其他任何@property不同,我怎樣才能使它行爲?

+1

'@ class'正向聲明一個類名。你在那裏顯示的AppDelegate.h應該使用'@interface'。 – 2009-12-02 00:37:28

回答

2

@synthesize生成訪問屬性的簡單方法。由於您的訪問器方法更復雜,因此無法使用@synthesize生成。

- (NSArray *)recipes { 
    return [data allKeys]; 
} 
+0

只需更換那個單詞即可順利完成任何更改。非常感謝! – Kaji 2009-12-01 23:07:41

+4

@dynamic不需要*除非*您要動態提供實現。 – bbum 2009-12-02 04:21:00

+0

謝謝,寶貝。即使不需要,我也一直在使用@dynamic。 – 2009-12-02 11:58:23

11

@property「僅僅」是方法聲明的簡寫。 @dynamic意味着您將在運行時動態提供實現,這是一種非典型的高級使用模式。

因此:

@property (readonly) NSArray *recipes; 

是,在報頭中,簡寫:

- (NSArray *) recipes; 

@synthesize recipes;將合成由@property聲明隱含的方法。沒有更多,不少。由於有人提到它,@synthesize recipes=_recipes;將綜合這些方法,但使用實例變量_recipes進行存儲(而不是recipes)。

如果您實現自己的吸氣劑(因爲這是隻讀的,只有一個getter),形式爲:

- (NSArray *) recipes { 
    return ....; 
} 

再有就是不需要任何@synthesize@dynamic

+0

對於_far_更好的答案+1。 – Abizern 2009-12-02 11:13:22