将属性内的结构包装到NSValue中

时间:2012-07-26 11:22:19

标签: objective-c struct

我使用NSValue来包装我定义的结构,但是当通过@property接收结构时,我收到此错误:请求的属性表达式的地址。

可以使用属性来完成,还是先将struct存储在变量中?

无效代码:

NSValue *previousTileObj = [NSValuevalue:&self.previousTile withObjCType:@encode(RobotTile)];               

有效代码:

RobotTile localPreviousTile = self.previousTile;
NSValue *previousTileObj = [NSValuevalue:&localPreviousTile withObjCType:@encode(RobotTile)];

2 个答案:

答案 0 :(得分:1)

您不能将调用结果的地址作为对象属性的访问者。

这是因为语句self.previousTitle只是Objective-C消息调用[self previousTitle]的语法糖,其语义类似于函数调用的语义,因为结果值在内存中没有真正的位置因此,它不能使用&运算符获取其地址。

但是,您可以通过将访问者调用包装在C数组文本中来将结果欺骗到可寻址对象中。由于数组本质上是指向第一个元素的指针,因此会产生指向所需数据的指针。

NSValue *previousTileObj = [NSValue value:(RobotTile []){self.previousTile} 
                             withObjCType:@encode(RobotTile)];

答案 1 :(得分:0)

您可以利用structure support in key-value coding并执行:

NSValue *previousTileObj = [self valueForKey:@"previousTile"];