财产拒绝合成

时间:2009-12-01 22:50:02

标签: objective-c cocoa properties instance-variables

我一直在通过截屏视频here来学习如何编写基于表格的iPhone应用程序,到目前为止它一直很顺利。现在我已经到了第三集的中途,它开始遇到障碍。

为了删除表格顶层的临时硬编码,教程为所有条目及其数据创建NSMutableDicitonary,然后使用{{1}创建NSArray }}语句获取一个只包含要在表格单元格中显示的词条的数组。

我遇到的问题是数组的变量拒绝合成。

违规变量在forKeys文件中定义,其余属性如下:

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

我尝试过这种方法,但它创造了比以前更多的错误。是什么让这个变量定义与任何其他@property不同,我怎样才能使它表现出来?

2 个答案:

答案 0 :(得分:11)

@property“仅仅”是方法声明的简写。 @dynamic意味着您将在运行时动态提供实现,这是一种非典型的高级使用模式。

因此:

@property (readonly) NSArray *recipes;

在标题中,是:

的简写
- (NSArray *) recipes;

@synthesize recipes;将合成@property声明隐含的方法。不多也不少。由于有人提到它,@synthesize recipes=_recipes;将合成方法,但使用实例变量_recipes进行存储(而不是recipes)。

如果您实现自己的getter(因为这只是一个getterly,只有一个getter),其形式如下:

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

然后就不需要@synthesize@dynamic

答案 1 :(得分:2)

@synthesize生成一种访问该属性的简单方法。由于您的访问方法更复杂,因此无法使用@synthesize生成。

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