【发布时间】:2013-07-07 21:42:37
【问题描述】:
我很难通过示例来理解私有实例变量。在阅读了私有实例变量之后,我去了 Xcode 并尝试验证它们是如何工作的。
在我正在阅读的书中,它指出如果您在超类的实现文件中声明一个实例变量,则该实例变量将是私有的,子类无法访问。
我尝试证明它没有任何运气。
/** SuperClass interface file**/
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
-(void) setX;
-(void) printX;
@end
/**SuperClass implementation file **/
#import "ClassA.h"
@implementation ClassA
{
int x;
}
-(void) setX
{
x = 100;
}
-(void) printX
{
NSLog(@" x is equal to %i", x);
}
@end
/** interface file of subclass **/
#import "ClassA.h"
@interface ClassB : ClassA
@end
/**Main file **/
#import "ClassA.h"
#import "ClassB.h"
int main(int argc, const char * argv[])
{
@autoreleasepool
{
ClassA * a;
a = [[ClassA alloc] init];
ClassB * b;
b = [[ClassB alloc] init];
[b setX];
[b printX];
}
return 0;
}
程序打印以下内容: x 等于 100
“x”不是私有实例变量,不能被对象“b”访问,因为“x”是在超类“a”的实现文件中声明的,而“b”是一个子类?
书上说“子类直接访问的实例变量必须在接口部分声明,而不是在实现部分......在实现部分声明或合成的实例变量是私有实例变量,不是子类可以直接访问。”
真的被这个弄糊涂了。
【问题讨论】:
-
我认为
@implementation ClassA { int x; }部分甚至不应该编译。你的代码真的是这样吗? -
有趣,它确实可以编译。我以前从未见过这种结构。
-
是的,我只是直接从 Xcode 复制了它。你觉得那部分有什么问题?
-
这样声明 ivars 完全没问题。从 Xcode 4 开始就是这样。
-
@somid,我用 cmets 做了一个要点给你解释这个 - gist.github.com/dunenkoff/5963677
标签: objective-c