RetainCount记忆不是免费的

时间:2011-05-04 16:47:14

标签: cocoa memory-management

我坚持使用Cocoa Memory Managagment。

- (IBAction) createPush:(UIButton *)sender {
    [create setEnabled:NO];
    [release setEnabled:YES];

    aLocation = [[Location alloc] init];

    // Put some Example Stuff in the Class
    aLocation.title = @"Apartment";
    aLocation.street = @"Examplestreet 23";
    aLocation.zip = @"12345";
    aLocation.city = @"Exampletown";
    aLocation.http = @"http://google.com";
    aLocation.info = @"First Info Text";
    aLocation.info2 = @"Second Info Text, not short as the first one";
    aLocation.logoPath = @"http://google.de/nopic.jpg";

    [aLocation.pictures addObject:@"http://google.de/nopic.jpg"];
    [aLocation.pictures addObject:@"http://google.de/nopic.jpg"];
}

 - (IBAction) releasePush:(UIButton *)sender {
     [release setEnabled:NO];
     [create setEnabled:YES];

     [aLocation release];
     aLocation = nil;
}

如果设置或获取变量,此代码可以正常工作,但是当我调用'last'版本(因此保留计数为0)时,会调用dealloc aLocation的方法,但是在Instruments Allocations中,您会看到没有给出内存回来。

这里的位置来源:

http://homes.dnsalias.com/sof/Location.m 相同的链接带有'.h'而不是'.m'作为Header文件(对不起,因为Spaming规则)。

整个项目:http://homes.dnsalias.com/sof/Location.zip

感谢您的帮助,我的失败在哪里?丹尼斯

3 个答案:

答案 0 :(得分:1)

  

如果我设置或获取,此代码可以正常工作   变量,但当我称之为'最后'   释放(所以保留计数为0)它   dealloc aLocation的方法得到   叫,但在仪器分配中   你看到没有回复记忆。

你的意思是“没有回忆”?

虽然命名奇怪,但aLocation的内存管理是正确的是上面的代码(假设你已经在dealloc中发布了它。)


  

为什么释放单个对象时内存使用量不会减少?

(意译)

您的物体很可能相对较小,因此单次释放低于仪器中显示的约20K左右。

如果您的应用因内存使用问题而崩溃,那么查看单个重新分配是错误的开始。要做的第一件事就是回答为什么你的应用程序正在积累内存以及导致这种增长的原因。

将Allocations工具配置为仅跟踪实时分配。然后按总内存使用量排序。这将向您展示哪种类型的分配消耗最多的内存。首先要减少它。

Heapshot analysis在这些情况下非常有效。

答案 1 :(得分:0)

此处有额外的信息,因为链接数量最多而且我没有机会发布图片......

  

你的意思是“没有回忆”?

我会告诉你仪器运行,然后它应该是清楚的。 Screenshots from Instruments run

如果需要更多详细信息klick here for Instruments Run。

答案 2 :(得分:0)

你的代码很好。你错误的是仪器的输出。没有位置对象泄漏。

对于泄漏,请使用“泄漏”仪器。它不会开火。 : - )