如何修复内存泄漏?

cyb*_*mon 5 xcode memory-management objective-c instruments

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

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

实例

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

Jam*_*ter 4

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

以下事情会增加保留计数

  • [[分配]初始化]
  • 新的
  • 复制
  • [保持]
  • 添加一个对象到数组
  • 添加一个对象作为子对象(例如视图)
  • 可能还有更多,但您似乎没有在代码中使用任何其他内容

以下减少保留计数

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

您应该检查代码并确保数组中的每个保留或添加都与相应的版本匹配。(可以在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];
    }
    ...
 }
Run Code Online (Sandbox Code Playgroud)

我认为您唯一缺少的是在 dealloc 方法中调用release

-(void) dealloc
{
    [stagepickerarray release];  //Do this for each of your arrays
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)