2

我正在设计自动持久对象,为此我需要(a)定位指针成员,(b)找到它们的位置。编译器有这些信息,我希望反射会提供它,但我不知道该怎么做。例如,如果一个对象从地址 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 实例进行低级处理并不是一个好主意。如果你真的想在低级别实现持久性,我建议你使用类似备忘录模式的东西来拥有一个与实现分离的内部状态,并且可以纯粹在 C 中实现。

于 2012-11-26T15:20:24.757 回答