访问父类的私有实例变量

时间:2012-01-24 14:55:49

标签: objective-c

我无法弄清楚为什么B类可以访问A类私有实例变量。 这是我的代码

A.H

#import <Foundation/Foundation.h>

@interface A : NSObject 
{

@private
    int x;
}

@property int x;

-(void)printX;
@end

A.M

#import "A.h"

@implementation A
@synthesize x;

-(void)printX
{
    NSLog(@"%i", x);
}

@end

B.h

 #import "A.h"

    @interface B : A 
    {

    }

    @end

的main.m

    B *tr = [[B alloc] init];
    tr.x = 10; 
    [tr printX];

这里我可以访问A类x的实例变量,尽管它被声明为私有?

2 个答案:

答案 0 :(得分:1)

您不是在那里访问私有变量,至少不是直接访问:您正在访问一个公共财产,它可以合法访问私有ivar。

您的代码与此相同:

B *tr = [[B alloc] init];
[tr setX:10]; 
[tr printX];

@synthesize语句为您创建了getter和setter方法。如果您只想获得一个getter,请标记您的属性readonly,并通过A类中的ivar执行所有着作。

答案 1 :(得分:-1)

在您的实施文件中,请在顶部执行此操作..

@interface A : NSObject 
{

@private
    int x;
}
@property int x;
@end

这样,x将是私有的,因为它在实现文件中。不是接口部分...所有类都导入A的接口部分..所以它的变量可以被子类访问。