2011-08-30 160 views
5

经过长时间的配置文件测试后,我发现在我的一个“.m”文件中,内存泄漏发生在viewdidload部分。我检查了一下,xcode突出显示了我用值初始化了拾取器数组的部分。我的程序使用用户输入的采集器。我的程序中有3个不同的视图。第一个是免责声明,第二个是用户可以选择他/她想要执行的计算类型的菜单。每个计算都需要用户从选取器输入的某些输入。例如。其中一个视图具有5个输入,由5个不同的输入单元处理,单独的数组用于保存这些值。这些数组使用该视图的viewdidload方法中的值进行初始化。这是我运行测试后发现的:如何修复内存泄漏?

-viewDidLoad .................................. .................................................. ...............

instantiation

这是我第一次开发的应用程序,我有点困惑该怎么做。任何帮助,将不胜感激。

+2

我的眼睛伤害=( –

回答

4

目标c中的对象具有保留计数。如果在对象超出范围时(当您停止使用它时)该保留计数大于0,则会发生泄漏。

以下事情增加保留计数

  • [[ALLOC] INIT]
  • 拷贝
  • [保留]
  • 添加对象到一个数组
  • 添加作为孩子的对象(如视图)
  • 有可能更多,但你不出现使用任何其他人在你的代码

下减少保留计数

  • [发行]
  • 从数组
  • 删除对象,如果你的dealloc一个数组,其所有对象被释放

你应该通过你的代码,并确保每个数组的保留或添加都与一个对应的g版本。 (你可以在dealloc方法中释放成员变量)。

编辑:杰里米做我的回答没有

一旦你添加一个对象到一个数组一个有效的点,它取得所有权,当它与它做会释放对象。你所要做的就是确保你根据内存管理规则释放你自己拥有的任何内容。

还有一些autorelease对象,看看这个例子;

-(init){ 
    ... 
    stagePickerArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < 3; i++) 
    { 
     //this string is autoreleased, you don't have call release on it. 
     //methods with the format [CLASS CLASSwithsomething] tend to be autorelease 
     NSString *s = [NSString stringWithFormat:@"%d", i); 
     [stagePickerArray addObject:s]; 
    } 
    ... 
} 

我认为你缺少的仅仅是一个电话在你的dealloc方法来释放

-(void) dealloc 
{ 
    [stagepickerarray release]; //Do this for each of your arrays 
    [super dealloc]; 
} 
+1

对不起,但这是误导。您不需要将一个添加项与一个发行版匹配。一旦将一个对象添加到数组中,它将获得所有权并在完成对象后释放该对象。所有你需要做的是确保你**根据内存管理规则释放你拥有的任何东西**。 – JeremyP

+0

用您评论的引用编辑来澄清 –

+0

非常感谢你:)。我回去并确保所有保留的对象,如文本框,拾取器,工具栏等。我还为每个阵列添加了一个版本,然后再次运行测试。这次没有内存泄漏。但是我有一个问题,在测试期间,我还检查了分配情况,总体字节数为9.3mb,活动字节为1.7 MB,这是否正常?还是应该担心? – cyberbemon

0

在Objective-C中,您需要注意分配内存的保留计数。如果你不需要它 - >释放它。

当你的alloc一个对象,它会返回一个保留计数对象= 1

通过使用保留,保留计数被递增, 通过发行,保留计数被递减。 每当保留计数等于0时,对象将被销毁。

所以,只要你想在其他地方使用对象,你需要保留它。所以你要确保这个对象不会在另一个'person'(或者它使用的任何东西)之后被删除,称为release。

这是一个非常非常简短的描述。检查以下指南 Memory Management Guide for iOS

(你也想读一些关于ARC - 自动保留计数 - !这在iOS5的是新ios5 best practice release retain

+0

谢谢:)。我会看看那个! 。我目前正在使用iOS 4 xD – cyberbemon

2

泄漏工具只会告诉你在哪里哟分配它认为泄漏的对象,所以,它告诉。你,例如,该

NSString* answer = [NSString stringWithFormat: ... 

分配是永远不会被释放。现在,一个对象,-stringWithFormat:为您提供了一个对象,you do not own,你似乎没有任何地方保留。因此,你不需要将其释放,所以不能自行泄漏。

这意味着其他东西,你自己必须保留它,你永远不会释放别的东西。主要嫌疑人似乎是stagePickerArray。检查你是否在某处发布stagePickerArray。如果它位于-viewDidLoad的本地,则必须在该方法结束之前释放或自动释放。如果它是一个实例变量,它必须在该类的-dealloc方法中发布。

+0

谢谢:)我忘了为阵列添加发行版!这是问题的原因! – cyberbemon