gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:45 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com