2

I am designing automatically persistent objects, and for that I need (a) to locate members which are pointers, (b) to find their locations. The compiler has this information, and I expected that the reflection would provide it, but I cannot figure out how to do it. For example, if an object starts at address 505060

@interface MyClass : NSObject {

  NSString *name; // class offset 4B,  member address 505064
  int code;
  MyClass *next;  // class offset 12B, member address 505072
}
@end
4

2 に答える 2

6

所有するオブジェクトのアドレスに対する ivar の位置は、実装の詳細です。これは明確に定義された実装の詳細ですが、ivar のオフセットを知る実際の理由はほとんどありません。

ivar がどこにあるかを本当に知りたい場合は、Objective-C ランタイム関数class_getInstanceVariable()ivar_getOffset(). ただし、何をしようとしているのかをお知らせいただければ、問題を解決するためのよりスマートなアプローチを提案できる場合があります。

于 2012-11-26T15:22:35.290 に答える
0

フィールドへの参照を取得することにより、フィールドのアドレスを簡単に取得できます。

@interface MyClass : NSObject
{    
  NSString *name; // class offset 4B,  member address 50564
  int code;
  MyClass *next;  // class offset 12B, member address 50572 
} 
@end


void *pointer = &name;

または、ObjectiveCランタイムを直接使用することもできます(Jonhatanの回答を参照)

しかし、これは、ObjectiveCで永続性を実装する方法ではありませんNSCoding。vtablesなどを含むObjectiveCインスタンスで低レベルにすることはお勧めできません。本当に低レベルで永続性を実装したい場合は、mementoパターンのようなものを使用して、実装から分離され、純粋にCで実装できる内部状態を設定することをお勧めします。

于 2012-11-26T15:20:24.757 に答える