以下是来自apple开发人员的一个例子(简化):
@interface myController : UITableViewController {
NSArray *samples;
}
@property (nonatomic, retain) NSArray *samples
声明
的目的是什么?{
NSArray *samples;
}
当您再次将其声明为属性时?如果你遗漏:
{
NSArray *samples;
}
您仍然可以在.m中使用@synthesize
并获取对它的引用!
我对第一次宣言的目的感到有些困惑。
由于
答案 0 :(得分:3)
属性只是一种向数据声明访问器的便捷方式。它通常会导致一些成员变量但不一定。该成员var可以有不同的名称:
@interface myController : UITableViewController {
NSArray *mSamples;
}
@property (nonatomic, retain) NSArray *samples
@end
@implementation
@synthesize samples = mSamples;
@end
或者你可以使用没有变量的属性:
@interface myController : UITableViewController {
}
@property (nonatomic, retain) NSArray *samples
@end
@implementation
-(NSArray*) samples {
//you can for example read some array from file and return it
}
-(void) setSamples:(NSArray*) arr {
//write that array to file or whatever you want
}
@end
使用新的编译器,您可以使用没有ivars的属性,编译器将隐式生成它们。
答案 1 :(得分:1)
使用属性声明,明确声明支持实例变量没有任何目的或好处。这只是习惯的残羹剩饭。
编辑:对于iOS或Mac 64位Intel,明确声明属性永远不需要ivars。但是其他Mac工作需要它们 - 因此就是例子。
另外,我确实找到了不同之处。当明确声明ivar时,除非另有说明,否则它是受保护的ivar,可用于子类。但是当为属性隐式创建ivar时,子类无法访问ivar。