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 メッセージ call のシンタックス シュガーにすぎないためです。これは、結果の値がメモリ内に実際の場所を持たないという点で関数呼び出しのセマンティクスに似ているため、演算子[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 に答える