为什么如果我在 {} 括号之间的 @implementation 块中声明一个变量,尝试访问子类中的变量会产生编译错误?
问问题
9149 次
2 回答
4
这取决于您放置实例变量的位置。现代 Objective-C 允许您将它们放在您的@interface
or@implementation
中,或者根本不使用@synthesize
和自动合成来声明它们。
假设我们有一个 A 类:
啊
@interface A : NSObject
{
@protected
int i;
}
@end
是
#import "A.h"
@implementation A
{
@protected
int j;
}
@end
当我们声明一个子类B
时,我们导入头部并且可以看到的声明i
,但是由于我们不能导入实现,所以我们无法知道 的声明j
。
以下代码在该j
行上产生一个错误。
#import "A.h"
@interface B : A
@end
@implementation B
- (int)i {return i;}
- (int)j {return j;}
@end
更新/附加说明
除了在自己的文件中实现类 ( C.m
),您还可以在单个文件中声明多个实现。在这种情况下,这些类可以访问@implementation
超类中声明的 ivars:
通道
#import "A.h"
@interface C : A
@end
是
#import "A.h"
#import "C.h"
@implementation A
{
@protected
int j;
}
@end
@implementation C
- (int)j {return j;}
@end
于 2013-10-02T21:07:15.443 回答
0
在类的@implementation
部分中声明的实例变量默认是私有的,因此在子类中不可见。您可以使用@protected
可见性修改器来更改可见性。
@implementation MyClass
{
int _foo; // Can't be accessed directly in subclass code.
@protected
int _bar; // Can be accessed directly in subclass code.
int _baz; // Can be accessed directly in subclass code.
}
于 2013-10-02T21:07:30.577 回答