正如您在下面的代码中看到的,我正在创建并初始化Vertex,然后我将其添加到Frame对象中的NSMutableArray实例变量中。由于我目前有这个设置,myVert由main拥有并由vertexList指向。我是否会更好地设置它以便我在addVertex方法中复制inVertex,以便对象获取其数据的所有权?
-(void)addVertex:(Vertex*) inVertex {
[vertexList addObject:inVertex];
}
// -------------------
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Frame *myFrame;
Vertex *myVert;
NSLog(@"MDD_ObjectTest ... ");
myFrame = [[Frame alloc] init];
myVert = [[Vertex alloc] initWithxPos:111 yPos:222 zPos:333];
[myFrame addVertex:myVert];
[myVert release];
// Clean up
[myFrame release];
[pool drain];
return 0;
}
最后,如果我要复制什么是最好的方法,我应该看看......
-(void)addVertex:(Vertex*) inVertex {
[vertexList addObject:[inVertex copy]];
}
虽然我不太确定如何在Vertex对象方面做些关于copyWith Zone的事情。
加里
答案 0 :(得分:3)
这取决于Vertex是否可变。
如果Vertex是不可变的:
由于inVertex不能更改任何数据,因此您可以使用它的当前方式。当您添加它时,vertexList将保留inVertex,并在您删除它时将其释放。由于inVertex的属性无法更改,因此将其存储与副本没有区别。
如果Vertex是可变的:
您应该存储副本,以便对inVertex的更改不会影响列表中存储的顶点。但请注意,您现在可能存在内存泄漏问题。当您复制一个副本的保留计数设置为1的对象时,当您将它存储在vertexList中时,保留计数变为2.当您从列表中删除它时,它将保留计数为1,导致内存泄漏,除非您记得发布它。在将其添加到vertexList以将其保留计数保持为1之后,释放它的最佳位置将是addVertex方法,因为只有一个东西具有对它的引用。
- (void) addVertex:(Vertex *) inVertex {
Vertex * copy = [inVertex copy];
[vertexList addObject:copy];
[copy release];
}
请注意,Vertex必须实现NSCopying协议才能实现此目的。
我建议使用不可变方法,除非你有一个真正有效的理由使顶点可变而不是方便。
修改:关于copyWithZone:
要实现对象复制,您必须实现定义copyWithZone:方法的NSCopying protcol。您需要对区域进行的唯一考虑是,不是在Vertex类上调用alloc方法,而是调用allocWithZone:方法。
- (id) copyWithZone:(NSZone *) zone {
Vertex * copy = [[Vertex allocWithZone:zone] initWithxPos:x yPos:y zPos:z];
// Any other copying that needs to be done
return copy;
}