由于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
自动创建的实例变量是私有的吗?是否有可能将它们设置为受保护,以便我可以在子类中访问它们? 我知道有可能自己声明实例变量,但我只是想知道......
使用像这样的超类它可以工作:(是因为它被明确声明为受保护吗?)
@interface MyFirstClass {
int size; // defined expressly and used as @protected
}
@property (readonly, nonatomic) int size;
@end
感谢您的帮助! 尼古拉斯。
答案 0 :(得分:3)
主界面中未声明的任何实例变量都是自动私有的,并且无法覆盖。如果在实现中定义实例变量时尝试使用范围修饰符,则会出现规范不一致的错误。
原因是每个实现文件通常只有一个类,这意味着编译器在编译其他类时不知道实例变量。如果同一个文件中有多个类,编译器可以知道它,但仍然不允许覆盖范围。在这种情况下,可能的原因可能是一致性,或者只是因此编译器不必查看实例变量的这么多地方。
答案 1 :(得分:0)
使用:
self.size = 10;
这将映射到setSize方法。