objective-c - 合成的实例变量是作为私有(private)的而不是 protected 生成的吗?

标签 objective-c properties private instance-variables

自从最近的 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/

相关文章:

java - log4j2.properties 将记录器级别设置为许多包

Python OpenSSL 生成公钥和私钥对

android - 私有(private)应用安卓和苹果

c++ - 为什么虚函数是私有(private)的?

iOS 在字符串中查找字符串

objective-c - 将 View 的 NSInteger 属性设置为 NSInteger?

iphone - 返回 PHP 网页生成的字符串

python - 自动更新Python类属性的最佳方法

ios - 内存使用量增加

objective-c - 桥接头是否有可能将 (void (^)(NSError *))block (ObjC) 变成 block : () throws -> () (Swift)?