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模拟器时无法编译。
答案 0 :(得分:15)
当前SDK(3.0)中的iPhone模拟器使用主机的运行时,它不支持32位模式下的合成ivars。在模拟器修复之前,您必须@synthesize
您的ivars。 (提交Apple要求此增强功能的错误最好。)
答案 1 :(得分:4)
您需要有一个变量来“备份”合成属性,除非您打算自己实现该属性。
修复代码的最简单方法是添加一个实例变量:
@interface MyClass : NSObject {
NSString * prop1;
}
@property NSString *prop1;
@end