2009-12-15 53 views
2

正如你可以在代碼中看到下面我創建和初始化一個頂點,然後我我的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]]; 
} 

雖然我有點不確定如何在以下方面做有關copyWith區域的頂點對象。

gary

回答

3

這取決於Vertex是否可變。

如果頂點是一成不變的:

由於inVertex不能有任何數據的改變,你擁有了它目前的方式是好的。 vertexList將在添加它時保留inVertex,並在刪除它時釋放它。由於inVertex的屬性無法更改,因此將其與副本進行存儲沒有區別。

如果頂點是可變的:

,可以儲存一個副本,以便使更改inVertex不會影響存儲在列表中的頂點。但請注意,您現在有可能發生內存泄漏。當您複製副本的保留計數設置爲1的對象,那麼當你將它存儲在VertexList時,保留計數變爲2.當您從列表中刪除,則其值爲一的保留計數,造成內存泄漏,除非你記得發佈它。釋放它的最佳地點將在addVertex方法將它添加到VertexList時後保持其保留計數爲1,因爲只有一個事物都有它的一個引用。

- (void) addVertex:(Vertex *) inVertex { 
    Vertex * copy = [inVertex copy]; 
    [vertexList addObject:copy]; 
    [copy release]; 
} 

請注意,頂點必須實現NSCopying協議才能工作。

我建議使用一成不變的方法,除非你有一個真正有效的理由讓頂點可變比其他的便利。

編輯:關於copyWithZone:

要實現對象複製,你必須實現NSCopying協議型定義copyWithZone:方法。你需要與該區域唯一要考慮的是,而不是調用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; 
} 
+0

非常感謝,非常感謝...... – fuzzygoat

相關問題