自从最近的 iOS 运行时以来,我们能够定义将为实例变量生成访问器的属性。据我了解,声明所使用的实例变量不是强制性的,因为它会自动为我们完成。
例如,如果我写:
@interface MyFirstClass
@property (readonly, nonatomic) int size;
@end
在 .m 中
@implementation MyFirstClass
@synthesize size;
@end
然后将为我添加一个名为“size”的实例变量,并实现一个名为“-(int)size”的方法。
问题是,当我创建第二个类 MySecondClass(它是 MyFirstClass 的子类)时,我似乎无法访问该子类中的实例变量大小:
@interface MySecondClass : MyFirstClass
@end
@implementation MySecondClass
- (id)init {
if (self = [super init]) {
size = 10; // this yields and error
}
return self;
}
@end
自动创建的实例变量是私有(private)的吗?是否可以将它们设置为 protected 以便我可以在子类中访问它们? 我知道有可能自己声明实例变量,但我只是想知道...
对于这样的父类(super class),它可以工作:(是因为它被明确声明为 protected 吗?)
@interface MyFirstClass {
int size; // defined expressly and used as @protected
}
@property (readonly, nonatomic) int size;
@end
谢谢你的帮助!! 尼古拉斯。
最佳答案
任何未在主界面中声明的实例变量都是自动私有(private)的,并且不能被覆盖。如果在实现中定义实例变量时尝试使用作用域修饰符,则会出现规范不一致的错误。
原因是每个实现文件通常只有一个类,这意味着编译器在编译其他类时不知道实例变量。如果同一个文件中有多个类,编译器可能知道,但仍然不允许覆盖范围。在这种情况下,可能的原因可能是为了一致性,或者只是为了让编译器不必在很多地方查找实例变量。
关于objective-c - 合成的实例变量是作为私有(private)的而不是 protected 生成的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9244745/