objective-c - 如何修复内存泄漏?

标签 objective-c xcode memory-management instruments

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

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

instantiation

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

最佳答案

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

以下内容会增加保留计数

  • [[alloc] 初始化]
  • 复制
  • [保留]
  • 将对象添加到数组
  • 添加一个对象作为子对象(例如 View )
  • 可能还有更多,但您似乎没有在代码中使用任何其他

以下减少保留计数

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

您应该仔细检查您的代码并确保对数组的每个保留或添加都与相应的版本相匹配。 (可以在dealloc方法中释放成员变量)。

编辑:杰里米提出了一个有效的观点,我的回答没有

Once you add an object to an array, it takes ownership and will release the object when it is done with it. All you need to do is make sure you release anything you own according to the memory management rules

还有自动释放对象,看看这个例子;

-(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 方法中调用 release

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

关于objective-c - 如何修复内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244641/

相关文章:

ios - 如何在 objective-c 中从谷歌驱动器下载jpg、png、pdf、doc.ppt、rtf等文件

xcode - 多个 UITableView 但有些行比其他行小

C++ EasyBMP 指针问题

java - 从 Iterable 创建 List 时使用哪个实现

ios - Objective c 在转换为 UIImage 时丢失了 CIImage 内存

ios - ContainerView 位置不正确

ios - 需要在启用 ARC 的情况下使用 Leaks 进行分析吗?

ios - 构建后 XCode iOS 颜色不匹配

objective-c - Abc.app 未密封的内容存在于 bundle 根目录中 - Xcode, bundle 需要任何更改吗?

c++ - 托管类中的 native 指针