2009-12-01 67 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