gpt4 book ai didi

objective-c - copyWithZone 设置实例变量?

转载 作者:太空狗 更新时间:2023-10-30 03:28:47 27 4
gpt4 key购买 nike

copyWithZone(见下文)是否正确,尤其是我使用 setter 填充新对象实例变量的那一点?

@interface Planet : NSObject <NSCopying>
{
NSString *name;
NSString *type;
NSNumber *mass;
int index;
}
@property(copy) NSString *name;
@property(copy) NSString *type;
@property(retain) NSNumber *mass;
@property(assign) int index;
-(void)display;
@end

-(id) copyWithZone: (NSZone *) zone {
Planet *newPlanet = [[Planet allocWithZone:zone] init];
NSLog(@"_copy: %@", [newPlanet self]);
[newPlanet setName:name];
[newPlanet setType:type];
[newPlanet setMass:mass];
[newPlanet setIndex:index];
return(newPlanet);
}

EDIT_001:

这是更好的方法吗?

-(id) copyWithZone: (NSZone *) zone {
Planet *newPlanet = [[[self class] allocWithZone:zone] init];
[newPlanet setName:[self name]];
[newPlanet setType:[self type]];
[newPlanet setMass:[self mass]];
[newPlanet setIndex:[self index]];
return(newPlanet);
}

非常感谢

加里

最佳答案

(假设深拷贝是你想要的)对于我们想要制作的副本,使用 copyWithZone: 作为对象实例变量,并使用 = 简单地设置原始实例变量。

- (id)copyWithZone:(NSZone *)zone
{
MyClass *copy = [[MyClass alloc] init];

// deep copying object properties
copy.objectPropertyOne = [[self.objectPropertyOne copyWithZone:zone] autorelease];
copy.objectPropertyTwo = [[self.objectPropertyTwo copyWithZone:zone] autorelease];
...
copy.objectPropertyLast = [[self.objectPropertyLast copyWithZone:zone] autorelease];

// deep copying primitive properties
copy.primitivePropertyOne = self.primitivePropertyOne
copy.primitivePropertyTwo = self.primitivePropertyTwo
...
copy.primitivePropertyLast = self.primitivePropertyLast

// deep copying object properties that are of type MyClass
copy.myClassPropertyOne = self.myClassPropertyOne
copy.myClassPropertyTwo = self.myClassPropertyTwo
...
copy.myClassPropertyLast = self.myClassPropertyLast


return copy;
}

但是请注意,与 self 和 copy 相同的类的属性必须在没有 copyWithZone: 的情况下进行设置。否则,这些对象将再次调用此 copyWithZone,并尝试使用 copyWithZone 设置它们的 myClassProperties。这会触发一个不需要的无限循环。 (此外,您可以调用 allocWithZone: 而不是 alloc: 但我很确定 alloc: 调用 allocWithZone: 无论如何)

在某些情况下,使用 = 深度复制同一类的对象属性可能不是您想做的事情,但在所有情况下(据我所知)使用 = 深度复制同一类的对象属性copyWithZone: 或任何调用 copyWithZone: 的东西都会导致无限循环。

关于objective-c - copyWithZone 设置实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2012845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com