我有一个MyClass类。我在这里夸大其词,但我们说MyClass有1000个实例变量。然后,我创建了一个名为MySubClass的子类,其中包含MyClass所具有的所有实例变量,以及另外一个。
问题:给定MyClass类的MyObj对象,是否有一种简单的方法可以创建MySubClass类的相应对象MyDerivedObj,这样MyDerivedObj的实例变量与MyObj的实例变量相同? “相同”,我的意思强烈相同,在某种意义上,如果MyObj的实例变量是指向对象的指针,MyDerivedObj的相应实例变量应指向相同的内存。
答案 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
例程更加简单。
使用复制协议实现复制构造函数可能有一个快捷方式,但我无法看到如何使它比上面给出的示例更容易。