对象拥有其数据?

时间:2009-12-15 14:54:36

标签: objective-c

正如您在下面的代码中看到的,我正在创建并初始化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的事情。

加里

1 个答案:

答案 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;
}
相关问题