在进行长轮廓测试后,我发现在我的一个“.m”文件中,内存泄漏发生在viewdidload部分。我查了一下,xcode突出显示了我用值初始化选择器数组的部分。我的程序使用拣货员进行用户输入。我的程序中有3 5个不同的视图。第一个是免责声明,第二个是用户可以选择他/她想要做的计算类型的菜单。每次计算都需要用户从选择器输入的某些输入。例如。其中一个视图有5个输入,由5个不同的uipickers处理,带有用于保存值的单独数组。这些数组使用该视图的viewdidload方法中的值进行初始化。这是我在运行测试后发现的:
.................................................. ................................................. < / p>
这是我第一次开发应用程序,我对于该怎么做感到困惑。任何帮助,将不胜感激。
答案 0 :(得分:4)
目标c中的对象具有保留计数。如果当对象超出范围时(当您停止使用它时)此保留计数大于0,则它会泄漏。
以下事项会增加保留计数
以下减少保留计数
您应该检查代码并确保数组的每个保留或添加都与相应的版本匹配。 (您可以在dealloc方法中释放成员变量。)
编辑:杰里米提出了一个有效的观点,即我的答案不是
将对象添加到数组后,它将获得所有权,并在完成对象时释放该对象。您需要做的就是确保根据内存管理规则发布您拥有的任何内容
还有自动释放对象,看看这个例子;
-(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 :(得分:2)
泄漏工具只会告诉你在哪里分配它认为泄漏的对象。所以,它告诉你,例如,
NSString* answer = [NSString stringWithFormat: ...
分配一个永远不会被释放的对象。现在,-stringWithFormat:
为您提供了you do not own的对象,而您似乎无法将其保留在任何位置。因此,您不需要释放它,因此它本身不会泄漏。
这意味着你做拥有的其他东西必须保留它,你永远不会释放其他东西。主要嫌疑人似乎是stagePickerArray
。检查您是否在某处释放stagePickerArray
。如果它是-viewDidLoad
的本地,则必须在该方法结束之前释放或自动释放。如果它是一个实例变量,则必须在类的-dealloc
方法中释放它。
答案 2 :(得分:0)
在Objective-C中,您需要处理已分配内存的保留计数。如果你不需要它 - &gt;释放它。
每当你分配一个对象时,它将返回一个具有retain count = 1的对象。
通过使用retain,保留计数增加, 通过使用release,保留计数减少。 只要保留计数等于0,对象就会被销毁。
因此,无论何时您想在其他地方使用该对象,您都需要保留它。所以你要确保在另一个'person'(或其使用的任何东西;))被称为release之后不删除该对象。
这是一个非常非常简短的描述。请查看以下指南 Memory Management Guide for iOS
(你也想读一下ARC - 自动保留计数 - 这是iOS5中的新功能!ios5 best practice release retain