2012-12-19 121 views
1

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

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。在我NKLevelVC,我ViewController,我用这个指令:

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

对象levelNSMutableArrayallocviewDidLoadinit。 在这里,我呼吁执行此操作的另一种方法:

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

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

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

以下是图像:http://f.cl.ly/items/1Y2Z1e2K3e3Y3e1I1z26/Schermata%202012-12-19%20alle%2011.18.51。png –

回答

1

之前看进入仪器你有没有试过你的代码的静态分析?这可能有助于解决简单的内存问题。

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

黄金规则是:对于每一个alloccopyretain你必须使用一个,只有一个,releaseautorelease

这是没有ARC的内存管理最重要的规则。所以,你的对象被数组保留的事实不关你的事情,只要记住你保留,分配或复制了什么,然后释放它。

PS:接下来的时间,你的代码会比仪器屏幕截图大有帮助。

+0

我在这个项目中使用ARC –

+0

所以你不应该使用'retain'和'release' ......静态分析说什么? – Zaphod

+0

静态分析说没有内存泄漏!但是这个对象留在记忆中,我通过仪器看到了这一点。 –

0

第一:使用仪器,看是否有效有内存泄漏,有一个为这个目的而作出的工具,并在那里你泄漏内存它会告诉你。第二:它取决于视图上有多少对象[保留]。如果你添加到一个数组,它保留看法,但如果你没有在创建视图的方法释放它,当你从阵列释放来看,计数将仍然是1