如何修复内存泄漏?

时间:2011-08-30 14:15:28

标签: objective-c xcode memory-management instruments

在进行长轮廓测试后,我发现在我的一个“.m”文件中,内存泄漏发生在viewdidload部分。我查了一下,xcode突出显示了我用值初始化选择器数组的部分。我的程序使用拣货员进行用户输入。我的程序中有3 5个不同的视图。第一个是免责声明,第二个是用户可以选择他/她想要做的计算类型的菜单。每次计算都需要用户从选择器输入的某些输入。例如。其中一个视图有5个输入,由5个不同的uipickers处理,带有用于保存值的单独数组。这些数组使用该视图的viewdidload方法中的值进行初始化。这是我在运行测试后发现的:

-viewDidLoad .................................................. ................................................. < / p>

instantiation

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

3 个答案:

答案 0 :(得分:4)

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

以下事项会增加保留计数

  • [[alloc] init]
  • 复制
  • [保留]
  • 将对象添加到数组
  • 将对象添加为子对象(例如视图)
  • 可能会有更多,但您似乎没有在代码中使用任何其他内容

以下减少保留计数

  • [发布]
  • 从数组中删除对象
  • 如果你释放一个数组,它的所有对象都被释放

您应该检查代码并确保数组的每个保留或添加都与相应的版本匹配。 (您可以在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