在Objective-C中访问子类中的受保护实例变量

时间:2013-10-02 20:44:50

标签: objective-c inheritance scope

为什么我在{}括号之间的@implementation块中声明一个变量,是否尝试访问子类中的变量会产生编译错误?

2 个答案:

答案 0 :(得分:4)

这取决于您放置实例变量的位置。现代Objective-C允许您将它们放在@interface@implementation中,或者不使用@synthesize声明它们并自动合成。

想象一下,我们有一个A类:

<强> A.H

@interface A : NSObject
{
@protected
    int i;
}
@end

<强> A.M

#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:

<强> C.h

#import "A.h"

@interface C : A
@end

<强> A.M

#import "A.h"
#import "C.h"

@implementation A
{
@protected
    int j;
}
@end

@implementation C
- (int)j {return j;}
@end

答案 1 :(得分: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.
}