Objective C私有实例变量错误

时间:2013-06-25 20:27:44

标签: objective-c

我刚刚开始使用Objective C尝试一个关于Objective in Objective C中的分数的示例程序:

#import <Foundation/Foundation.h>

//---- @interface section ----

@interface Fraction: NSObject

-(void)   print;
-(void)   setNumerator: (int) n;
-(void)   setDenominator: (int) d;

@end

//---- @implementation section ----

@implementation Fraction
{
 int  numerator;
 int  denominator;
}
-(void) print
{
  NSLog (@"%i/%i", numerator, denominator);
}

-(void) setNumerator: (int) n
{
  numerator = n;
}

-(void) setDenominator: (int) d
{
  denominator = d;
}

@end

// ----程序部分----

我一直在为instane变量分子和分母得到不一致的实例变量规范错误。如果我将声明移到@interface部分,错误消失但我想知道为什么我收到此错误?我在Snow Leopard 10.6.8上使用Xcode 3.6.2

2 个答案:

答案 0 :(得分:3)

您收到错误,因为需要在界面中声明ivars。

顺便说一句,你使用的是旧版本的xcode(可能太旧了,不能提交给appstore),所以你可能想看看获取xcode 4.6。 Objective-C语言也有很多更新。在现代objective-c中,不再需要像这样手动声明ivars。

如果您真的希望将ivars保留在头文件之外,您可以在.m文件中的空类别界面(也称为“类扩展名”)中声明它们:

@interface YourClass() {
  ivars here
}
@end

答案 1 :(得分:3)

仅在Xcode 4.2(LLVM编译器版本3.0)之后才支持@implementation块中的实例变量。您必须升级开发工具才能利用此功能。

此语言功能的动机是在类结构中实现更好的信息隐藏。这意味着您的接口的客户端(您的.h文件)可能不需要知道该类正在使用的ivars,因此它们“隐藏”在实现文件中。

隐藏ivar的另一种方法是将它们包含在实现(.m)文件的类扩展中:

// Fraction.m

@interface Fraction () {
  int  numerator;
  int  denominator;
}

@end

@implementation Fraction
// ...
@end

但它还需要Xcode 4.2+和现代运行时环境。

为了与旧编译器完全兼容,ivars只能放在.h文件的接口部分。