2012-06-24 77 views
0

我在解決一些相當可怕的內存泄漏時遇到了一些麻煩內存泄漏工具在我運行我的iOS應用程序時顯示給我。內存管理遞歸父母 - 目標C

我有一個Path對象,它包含同一個類的父變量,並且該父對象包含它自己的父對象等等。

我想要做的是給另一個對象一個這個對象的深層副本,然後它可以做它喜歡的那個副本,它應該對原始的沒有影響。

我認爲問題在於,當我做出這樣讓我的對象的副本:

- (id) copyWithZone:(NSZone *)zone { 
    ShortestPathStep *copy = [[[self class] allocWithZone:zone] initWithSteps:self]; 

    return copy; 
} 

這就要求我的副本建築工:

-(id)initWithSteps:(ShortestPathStep*)copyFrom 
{ 
    if ((self = [super init])) 
    { 
     position = copyFrom.position; 
     gScore = copyFrom.gScore; 
     hScore = copyFrom.hScore; 
     parent = [copyFrom.parent copy]; 
    } 

    return self; 
} 

我也試着釋放父dealloc方法,如下所示:

-(void)dealloc { 
    if(parent != nil) 
     [parent release]; 

    [super dealloc]; } 

但是,這給了我以下錯誤消息:

的malloc:*錯誤對象0x12df1810:指針被釋放沒有被分配

我應該如何處理複製此指針時,我分配的內存?

這是生產一個深層副本,包括父變量的深層副本?我得到的一些例外情況表明,我不想要的指針正在清理,或者正在我的代碼的其他區域重新分配。

編輯: 要解決我的例外在dealloc方法我已經改變了財產.h文件到:

@property (nonatomic, retain) ShortestPathStep *parent; 
+0

爲什麼你不通常在dealloc中釋放這個內存?它似乎我沒有得到你的問題,請嘗試解釋:) –

+0

我已經添加了什麼,當我嘗試釋放內存在dealloc方法,它給了我一個EXC_BAD_ACCESS錯誤。 – Demonofloom

回答

0

下面是一些常規注意事項

確保positiongScorehScore是父級的保留屬性屬性 ,使屬性成爲類型副本

@property (nonatomic, copy) Your_Parent parent; 

更新您的初始化函數

-(id)initWithSteps:(ShortestPathStep*)copyFrom 
{ 
    if ((self = [super init])) 
    { 
     self.position = copyFrom.position; 
     self.gScore = copyFrom.gScore; 
     self.hScore = copyFrom.hScore; 
     self.parent = copyFrom.parent; 
    } 

    return self; 
} 

現在的dealloc釋放應該工作。

+0

這給我留下了同樣的例外,但我設法通過設置屬性來解決這個問題。我認爲這應該解決我的內存泄漏問題。 – Demonofloom