我一直在通过截屏视频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不同,我怎样才能使它表现出来?
答案 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];
}