1

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

这可以使用属性来完成,还是我首先将结构存储在变量中?

无效代码:

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

有效代码:

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

2 回答 2

1

您不能将调用结果的地址获取到对象属性的访问器。

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

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

NSValue *previousTileObj = [NSValue value:(RobotTile []){self.previousTile} 
                             withObjCType:@encode(RobotTile)];
于 2013-12-21T10:05:17.563 回答
0

您可以利用键值编码中的结构支持并执行以下操作:

NSValue *previousTileObj = [self valueForKey:@"previousTile"];
于 2015-12-31T09:09:55.723 回答