2010-03-04 67 views
3

这可能是iPhone专用的,我不确定。编译器不会在为模拟器构建时发生抱怨,但在为设备编译时会引发一些时髦的错误,当我尝试为对象的引用设置属性时。例如,Objective-C,用于参考的属性

@property (nonatomic) CGRect &finalFrame; 

和coressponding合成

@synthesize finalFrame; 

声明为

CGRect finalFrame; 

一个变量提供错误

  • 类型的特性 'finalFrame' 不匹配类型的伊娃'finalFrame'
  • 无法识别的insn:
  • 内部编译器错误:总线错误
  • 内部编译器错误:在extract_insn,在recog.c:2904

但是我可以手动做没有问题,用下面的方法:

- (CGRect&)finalFrame; 
- (void)setFinalFrame:(CGRect&)aFrame; 

这是一个海湾合作委员会的错误?它为模拟器编译。

+1

该代码无法编译,因为'&'不是Objective-C中的声明符(换句话说,它不能用作变量声明的一部分)。你的意思是在你的示例代码中有&符号的地方输入星号吗? – jlehr 2010-03-04 17:08:40

+0

使用Obj-C++,应该明确指出,对不起 – Sam 2010-03-04 22:28:41

回答

5

你的属性被声明为引用类型(CGRect&),但你的实例变量不是引用类型(CGRect)。他们需要使用相同的@synthesize

另外,使用C++引用类型作为Objective-C属性有点奇怪,但我想这可能会工作,只要所有文件都被编译为Objective-C++。

+0

似乎很奇怪,它编译和工作在模拟器上。我读过的所有文档都指出,属性/合成配对应该只是我手动声明的内容的缩写。我明白这个变量没有被声明为CGRect&但当然不应该。 这是不是很奇怪?我没有看到使用引用有任何问题。我应该说我正在使用Obj-C++ – Sam 2010-03-04 22:28:12

+0

我的意思是我明白该属性需要与变量相同的数据类型,但如果它无法应对引用,肯定会出现该机制中的错误?也许我错过了对属性的一些基本理解,因为我一直认为它们基本上被预处理成了诸如我发布的那些方法。 – Sam 2010-03-04 22:31:04

+1

@Sam:说它被预处理成方法是不正确的。 '@ synthesize'指令可以生成方法,但并不像预处理器宏那样无用的文本替换。编译器必须将类型匹配起来才能生成适当的方法,显然,它不能很好地理解引用,以便生成将正常数据类型绑定到引用的适当方法。我想你可以把它称为一个错误,但实际上它只是不被支持的东西。 – Chuck 2010-03-04 23:29:21