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

use*_*125 8 inheritance scope objective-c

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

Bri*_*kel 4

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

假设我们有一个 A 类:

@interface A : NSObject
{
@protected
    int i;
}
@end
Run Code Online (Sandbox Code Playgroud)

#import "A.h"

@implementation A
{
@protected
    int j;
}
@end
Run Code Online (Sandbox Code Playgroud)

当我们声明一个子类时B,我们导入头文件并可以看到 的声明i,但是由于我们无法导入实现,所以我们无法知道 的声明j

下面的代码产生一个错误,就行了j

#import "A.h"

@interface B : A
@end

@implementation B
- (int)i {return i;}
- (int)j {return j;}
@end
Run Code Online (Sandbox Code Playgroud)

更新/补充说明

除了在自己的文件 ( C.m) 中实现类之外,您还可以在单​​个文件中声明多个实现。在这种情况下,这些类可以访问@implementation超类中声明的 ivars:

Ch

#import "A.h"

@interface C : A
@end
Run Code Online (Sandbox Code Playgroud)

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

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

@implementation C
- (int)j {return j;}
@end
Run Code Online (Sandbox Code Playgroud)