3

我有一个班级 MyClass。我在这里夸大了,但假设 MyClass 有 1000 个实例变量。然后,我创建了一个名为 MySubClass 的子类,其中包含 MyClass 拥有的所有实例变量,再加上一个。

问题:给定一个MyClass类的对象MyObj,有没有一种简单的方法可以创建一个MySubClass类的对应对象MyDerivedObj,使得MyDerivedObj的实例变量与MyObj的实例变量相同?“相同”,我的意思是非常相同,如果 MyObj 的实例变量是指向对象的指针,则 MyDerivedObj 的相应实例变量应该指向相同的内存。

4

4 回答 4

1

这些 ivars 都必须分开吗?如果我有类似的问题,我的第一直觉是将它们包装在某种集合 ivar (NS(Mutable)Array/Dictionary/Set) 中,然后你可以在上面有一个普通的 getter/setter 并做

myDerivedObj.collection = myObj.collection;

假设集合是具有“分配”内存管理策略的 MyObj 类的属性,我认为这应该保留内存引用。

(我对此还是有点陌生​​,所以请消除我逻辑中的任何缺陷/错误。)

于 2010-01-08T19:26:11.523 回答
1

本质上,对象的每个实例都将具有不同的 id;堆中不同的地址和不同的分配点。

因此,A 的实例变量和 B 的实例变量总是在不同的位置

现在,没有理由不能将 A 和 B 的实例变量包装到单独分配的结构中。这样,A 和 B 都可以有一个实例变量,它是指向一个充满值的结构的单个副本的指针。

就设置所有 1,000 个 ivars 而言,这也取决于您要设置它们的内容。如果为 0,那么它们将在对象实例化时自动设置。如果您想使用bcopy()一组模板化的值,我建议您使用指向结构的指针并进行单独的分配。如果不对最终会咬你的布局做出假设,就无法批量设置对象的实例变量。

于 2010-01-08T18:16:15.347 回答
0

我建议您为父类创建一个“复制构造函数”样式的初始化程序,并从子类初始化程序中MyClass调用它。MyDerivedClass

[MyDerivedClass initByCopying:someMyObject plusSomeNewProperties:stuff] ->
  [MyClass initByCopying:someMyObject] ->
    [NSObject init] -> // alloc, etc.

这是一些伪代码:

@interface MyClass : NSObject { 
  int AA;
  // ...
  int ZZ;
}   
@end

@implementation MyClass

-initByCopying:(MyClass*)other;
{
  if (self = [super init])
  {
    self.AA=other.AA;
    //...
    self.ZZ=other.ZZ;
  }
  return self;
}

@end

@interface MyDerivedClass {
  int AAA;
}
@end

@implementation MyDerivedClass 

-initByCopying:(MyClass*)other withNewValue:(int)newVar;
{
  if (self = [super initByCopying:(MyClass*)other])
  {
    self.AAA = newVar;
  }
  return self;
}

@end

我怀疑如果您有 1000 个成员项目,您可能需要考虑对除性能敏感的项目之外的所有项目使用属性包或 kvc,这将使您的initByCopying日常工作更加简单。

使用复制协议实现复制构造函数可能有一个捷径,但我看不出如何使它比我上面给出的示例更容易。

于 2010-01-08T19:51:15.983 回答
0

如果 ivars 被标记为 @public 或 @protected,是的,它们将完全相同。

于 2010-01-08T17:12:39.983 回答