2

我刚开始使用Objective C,尝试了一个关于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

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

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

4

2 回答 2

3

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

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

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

// Fraction.m

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

@end

@implementation Fraction
// ...
@end

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

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

于 2013-06-25T21:01:00.057 回答
3

您收到错误消息,因为需要在接口中声明 ivars。

顺便说一句,您使用的是非常旧的 xcode 版本(可能太旧而无法提交到应用商店),因此您可能需要考虑获取 xcode 4.6。Objective-C 语言也有很多更新。在现代的objective-c中,不再需要像这样手动声明ivars。

如果您真的想将 ivars 保留在头文件之外,您可以在 .m 文件中像这样在一个空的类别接口(也称为“类扩展”)中声明它们:

@interface YourClass() {
  ivars here
}
@end
于 2013-06-25T20:30:22.037 回答