即使每个alloc都被释放,内存也会泄漏

时间:2011-10-28 18:11:41

标签: ios xcode memory-leaks

过去两天我花在寻找内存泄漏上。我阅读了文档,并在互联网上搜索了很多信息(例如Owen Goss“在iOS应用程序中查找和修复内存泄漏”),但我仍然有太多的谜团需要解决。

例如,这段代码一次又一次地在仪器中亮起。我尽我所能但却无法修复它。

- (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]; //?

}

我认为其他人也可能感兴趣的是,我发布了我分配的内容。但它仍然在泄漏。我无法回答文档。或者我可以吗?

2 个答案:

答案 0 :(得分:9)

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

保留计数为2,因为mutableCopy会保留一次,而您再次呼叫retain。请勿在此处致电retain

请注意,如果您在名称中使用newallocretaincopy来调用方法,则您拥有该对象并且保留计数会增加。

答案 1 :(得分:1)

[NSObject mutableCopy];会返回一个对象,其retainCount增加1,因此您不需要另一个'retain'。

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

这应该做的工作:)