2011-10-28 170 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

相关问题