0

我一直在浏览这里的截屏视频,以学习如何编写基于表格的 iPhone 应用程序,到目前为止进展顺利。目前我已经完成了第三集的一半,它开始遇到障碍。

为了删除表格顶层的临时硬编码,本教程NSMutableDicitonary为所有条目及其数据创建一个,然后创建一个NSArrayusingforKeys语句以获取一个仅包含词条的数组,以显示在表格单元格中。

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

有问题的变量在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 不同,我怎样才能让它表现出来?

4

2 回答 2

11

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

因此:

@property (readonly) NSArray *recipes;

是,在标题中,简写为:

- (NSArray *) recipes;

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

如果您实现自己的 getter(因为这是只读的,所以只有一个 getter),格式如下:

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

那么就不需要@synthesizeor @dynamic

于 2009-12-02T04:26:31.043 回答
2

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

- (NSArray *)recipes {
    return [data allKeys];
}
于 2009-12-01T22:58:29.660 回答