我刚刚开始使用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
答案 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文件的接口部分。