iPhone模拟器:使用合成实例变量时构建错误

时间:2009-07-20 18:55:36

标签: iphone objective-c properties runtime

Cocoa / Objective-C有两个运行时:遗留运行时和“现代”运行时(这就是Apple所说的)。

根据Apple's documentation,“ iPhone应用程序和Mac OS X v10.5及更高版本的64位程序使用现代版本的运行时”。

到目前为止一切顺利。

现在,“现代”运行时支持一个名为“合成实例变量”的功能,这意味着您不必为每个声明的属性定义实例变量。实例变量将自动添加。引用来自iPhone Reference Library:“对于现代运行时,实例变量根据需要合成。如果已存在同名的实例变量,则使用它。

如果您在iPhone应用程序中使用此功能,它可以在iPhone(物理)设备上构建并运行良好,但是当您将目标更改为“iPhone模拟器”时,会出现构建错误:

合成属性'x'必须与兼容的ivar命名相同,或者必须明确命名为ivar

这里发生了什么? iPhone模拟器不是真正的iPhone模拟器吗?这是否意味着模拟器使用与物理iPhone不同的运行时?

如何在iPhone模拟器上使用此功能?

编辑:

定位iPhone模拟器时无法编译的代码是:

@interface MyClass : NSObject {
}

@property NSString *prop1;

@end

根据文档,这应该可以在“现代”运行时正常工作,实际上它可以在iPhone设备上运行,但在将目标更改为iPhone模拟器时无法编译。

2 个答案:

答案 0 :(得分:15)

当前SDK(3.0)中的iPhone模拟器使用主机的运行时,它不支持32位模式下的合成ivars。在模拟器修复之前,您必须@synthesize您的ivars。 (提交Apple要求此增强功能的错误最好。)

答案 1 :(得分:4)

您需要有一个变量来“备份”合成属性,除非您打算自己实现该属性。

修复代码的最简单方法是添加一个实例变量:

@interface MyClass : NSObject {
NSString * prop1;
}

@property NSString *prop1;

@end