2011-10-28 168 views
2

最近兩天我花費在尋找內存泄漏上。我已閱讀文檔並在互聯網上搜索了很好的信息(例如Owen Goss「查找並修復iOS應用程序中的內存泄漏」),但仍有許多謎團需要解決。即使每次發佈alloc都會發生內存泄漏

例如,這段代碼一次又一次地在儀器中亮起。我盡我所能,但無法修復。

- (void) updateUserDefaults 
{ 
    // alloc temporary Array for object´s positions 
    NSMutableArray *tArray = [[NSMutableArray alloc] init]; 

    // store locations of objects 
    for (int i=0; i<[originalOrigins count]; ++i) { 
     CGPoint foo = [self.view viewWithTag:100+i].center; 
     NSString *moo = NSStringFromCGPoint(foo); 
     [tArray addObject:moo]; 
     [moo release]; //? 
    } 

    // retrieve all stored positions for all objects 
    NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain]; 

    // replace with objects from this level 
    [zettelPannedOrigins replaceObjectAtIndex:zettelAtIndexInTonebank withObject:tArray]; 

    // save 
    [[NSUserDefaults standardUserDefaults] setObject:zettelPannedOrigins forKey:@"zettelPannedOrigins"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    // clean up memory 
    [tArray release]; 
    [zettelPannedOrigins release]; //? 

} 

我認爲其他人也可能會感興趣的是,我釋放我分配的內容。但它仍然在泄漏。這我不能回答文件。或者我可以嗎?

+4

勿放裏面loop--你不擁有該引用「哞哞」。 –

回答

9
NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain]; 

這將有2的保留計數,因爲mutableCopy保留一次,你又對它調用retain。這裏不要撥打retain。請記住,如果您在名稱中調用了名稱爲newallocretaincopy的方法,則您擁有該對象並且保留計數會增加。

+0

對不起,你在寫我的答案的時候張貼了,投了票! :) – ludesign

+0

我把額外的保留,因爲我的應用程序崩潰時有時調用此方法(/ /保存導致它)。殭屍說我參考了一個發佈的對象。所以我在想,在我使用它之前,可能會使用mutableCopy進行自動釋放。所以我把額外的保留。但是在我使用額外的保留之前,泄漏在那裏。 – me1974

+3

如果您在應用程序中插入額外的保留,以便在不理解原因的情況下不會崩潰,則不會修復崩潰,而只是將其移至以後......每次崩潰都有確切原因。 – bbum

1

[NSObject mutableCopy];會給你一個增加了retainCount的對象1,所以你不需要另一個'保留'。

NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] autorelease]; 

這應該做的工作:)

+0

如何確保在使用對象之前不會自動釋放對象? – me1974

相關問題