Objective C - 初始化子类对象的继承变量

时间:2010-01-08 17:08:17

标签: objective-c object initialization subclass

我有一个MyClass类。我在这里夸大其词,但我们说MyClass有1000个实例变量。然后,我创建了一个名为MySubClass的子类,其中包含MyClass所具有的所有实例变量,以及另外一个。

问题:给定MyClass类的MyObj对象,是否有一种简单的方法可以创建MySubClass类的相应对象MyDerivedObj,这样MyDerivedObj的实例变量与MyObj的实例变量相同? “相同”,我的意思强烈相同,在某种意义上,如果MyObj的实例变量是指向对象的指针,MyDerivedObj的相应实例变量应指向相同的内存。

4 个答案:

答案 0 :(得分:1)

固有地,对象的每个实例都有不同的id;堆中的不同地址和不同的分配点。

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

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

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

答案 1 :(得分:1)

那些ivars都必须分开吗?如果我有类似的问题,我的第一直觉是将它们包装在某种集合中(iv(Mutable)数组/字典/集合)然后你可以在它上面有一个普通的getter / setter而且只是

myDerivedObj.collection = myObj.collection;

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

(我还是有点新手,所以要记下我逻辑中的任何缺陷/错误。)

答案 2 :(得分:0)

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

答案 3 :(得分: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例程更加简单。

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