我开发了一个应用程序,现在我正在使用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.在我的NKLevelVC
,ViewController
中,我使用此指令:
[level addObjectsFromArray:[levelGenerator level1WithDelegate:self ciotola:ciotola bagliore:bagliore difficulty:NKDifficultyHard]];
对象level
是NSMutableArray
alloc
和init
viewDidLoad
。
从这里我调用另一个执行此操作的方法:
- (void)insertInArrayRandomly {
for (int i=0; i<[level count]; i++) {
[ingredienti insertObject:[level objectAtIndex:[[indexes objectAtIndex:i]integerValue]] atIndex:i];
}
}
对象ingredienti
是我NSMutableArray
中alloc
和init
的另一个viewDidLoad
。 indexes
是一个NSInteger
数组,其中包含随机索引以随机提取NKIngredient
个对象。
然后我这样做:
NKIngredient *ing = [ingredienti objectAtIndex:index];
[[self view] insertSubview:ing belowSubview:navBar];
[ing animateIngredient];
[ingredienti removeObject:ing];
答案 0 :(得分:1)
在研究仪器之前,您是否尝试过代码的静态分析?它可能有助于解决简单的内存问题。
但首先要检查的是:你是否遵循黄金法则?
黄金法则是:对于每个alloc
,copy
或retain
,您必须使用一个,release
或autorelease
。
这是没有ARC的内存管理最重要的规则。因此,对象保留的事实不属于您的业务,只需记住您保留,分配或复制并释放它的内容。
PS:下次,您的代码将比仪器截图更有帮助。
答案 1 :(得分:0)
首先:使用仪器查看是否存在内存泄漏问题,有一个工具用于此目的,它会告诉您泄漏内存的位置。 第二:它取决于在视图上制作[保留]的对象数量。如果添加到数组,它将保留视图,但如果不在创建视图的方法中释放它,则从数组中释放视图时,计数仍为1。