iOS - 内存和保留/释放问题

时间:2012-12-19 10:26:54

标签: ios memory memory-management instruments

我开发了一个应用程序,现在我正在使用Instruments查看内存使用情况。我在理解对象的保留/释放过程时遇到问题。这就是仪器所说的:

http://f.cl.ly/items/1Y2Z1e2K3e3Y3e1I1z26/Schermata%202012-12-19%20alle%2011.18.51.png

当我将对象添加到数组中时,当我将其添加到视图中以及从数组中取出时,保留计数会增加。 因此,当我使用removeFromSuperview时,对象retainCount永远不会为零,因此对象不会释放内存。

编辑1: 我忘了说我正在使用ARC。

编辑2: 我准确描述了发生了什么: 我在名为NKLevelGenerator的类中将对象与其他对象一起创建。在其中我分配NKIngredient s然后我将所有内容添加到将返回的NSArray。这里每个对象的保留计数为2.在我的NKLevelVCViewController中,我使用此指令:

[level addObjectsFromArray:[levelGenerator level1WithDelegate:self ciotola:ciotola bagliore:bagliore difficulty:NKDifficultyHard]];

对象levelNSMutableArray allocinit viewDidLoad。 从这里我调用另一个执行此操作的方法:

- (void)insertInArrayRandomly {
    for (int i=0; i<[level count]; i++) {
        [ingredienti insertObject:[level objectAtIndex:[[indexes objectAtIndex:i]integerValue]] atIndex:i];
    }
}

对象ingredienti是我NSMutableArrayallocinit的另一个viewDidLoadindexes是一个NSInteger数组,其中包含随机索引以随机提取NKIngredient个对象。 然后我这样做:

NKIngredient *ing = [ingredienti objectAtIndex:index];
[[self view] insertSubview:ing belowSubview:navBar];
[ing animateIngredient];
[ingredienti removeObject:ing];

2 个答案:

答案 0 :(得分:1)

在研究仪器之前,您是否尝试过代码的静态分析?它可能有助于解决简单的内存问题。

但首先要检查的是:你是否遵循黄金法则

黄金法则是:对于每个alloccopyretain,您必须使用一个,releaseautorelease

这是没有ARC的内存管理最重要的规则。因此,对象保留的事实不属于您的业务,只需记住您保留,分配或复制并释放它的内容。

PS:下次,您的代码将比仪器截图更有帮助。

答案 1 :(得分:0)

首先:使用仪器查看是否存在内存泄漏问题,有一个工具用于此目的,它会告诉您泄漏内存的位置。 第二:它取决于在视图上制作[保留]的对象数量。如果添加到数组,它将保留视图,但如果不在创建视图的方法中释放它,则从数组中释放视图时,计数仍为1。