【问题标题】:Memory leak even though every alloc is released即使每个分配都被释放,内存泄漏
【发布时间】:2011-12-17 12:04:28
【问题描述】:

最近两天我一直在寻找内存泄漏。我已经阅读了文档并在互联网上搜索了很好的信息(例如 Owen Goss “Finding and Fixing Memory Leaks in iOS Apps”),但我仍然有太多的谜团需要解开。

例如,这段代码在 Instruments 中一次又一次地亮起。我尽力了,但无法解决。

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

}

我认为对其他人来说可能也很有趣的是,我释放了我分配的东西。但它仍然在泄漏。我无法用文档回答这个问题。或者我可以吗?

【问题讨论】:

  • 不要在循环中释放“moo”——你不拥有那个引用。

标签: ios xcode memory-leaks


【解决方案1】:
NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain];

这将具有 2 的保留计数,因为 mutableCopy 保留它一次,而您再次调用 retain。不要在这里打电话给retain

请记住,如果您调用名称中包含 newallocretaincopy 的方法,则您拥有该对象,并且保留计数会增加。

【讨论】:

  • 对不起,你在我写答案的时候发帖了,投了赞成票! :)
  • 我放了额外的保留,因为我的应用程序有时在调用此方法时崩溃(//save 下的行导致它)。僵尸说我引用了一个释放的对象。所以我在想 mutableCopy 在我使用它之前可能是自动发布的。因此我把额外的保留。但是在我也使用额外的保留之前,泄漏就在那里。
  • 如果你在你的应用程序中添加额外的保留以使其在不了解原因的情况下不会崩溃,那么你并没有修复崩溃,你只是将它移到以后......每次崩溃都有一个确切的原因.
【解决方案2】:

[NSObject mutableCopy]; 将返回一个将 retainCount 增加 1 的对象,因此您不需要另一个“保留”。

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

这应该可以完成工作:)

【讨论】:

  • 如何确保对象在使用前不会自动释放?
猜你喜欢
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2012-06-08
  • 2012-04-03
  • 1970-01-01
  • 2011-01-27
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多