Objective c 自动释放对象上的内存泄漏?

Objective c 自动释放对象上的内存泄漏?,objective-c,memory-leaks,instruments,autorelease,Objective C,Memory Leaks,Instruments,Autorelease,我正在运行仪器来查找我的iPhone应用程序中的内存 正如你在下面的屏幕截图中看到的,我从一些基础对象中得到了一些奇怪的内存泄漏。 最让我烦恼的是,如果我理解正确的话,应该“自动”发布。例如:NSPredicate predicateWithFormat、NSKeyedUnarchiveObjectWithData等 以下是NSPredicate one的屏幕截图,其中包含更多信息: 你能帮我弄明白我做错了什么吗 在代码中,我只是这样做: NSPredicate *basePredicate

我正在运行仪器来查找我的iPhone应用程序中的内存

正如你在下面的屏幕截图中看到的,我从一些基础对象中得到了一些奇怪的内存泄漏。

最让我烦恼的是,如果我理解正确的话,应该“自动”发布。例如:NSPredicate predicateWithFormat、NSKeyedUnarchiveObjectWithData等

以下是NSPredicate one的屏幕截图,其中包含更多信息:

你能帮我弄明白我做错了什么吗

在代码中,我只是这样做:

NSPredicate *basePredicate = [NSPredicate predicateWithFormat:@"ANY fcLists IN %@", listsIds];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.context];
[self.fetchRequest setEntity:entity];

// Load the list of new items
NSPredicate *addedPredicate = [NSPredicate predicateWithFormat:@"fcStatus = -2"];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:basePredicate, addedPredicate, nil]];
[self.fetchRequest setFetchLimit:self.nbOfNewItems];
[self.fetchRequest setPredicate:predicate];
tmp = [self.context executeFetchRequest:self.fetchRequest error:&error];
所以我不应该释放谓词,对吗?不管怎样,我试过了,它使我的代码崩溃


提前感谢您的帮助

保留/释放模型不像(例如)malloc/free。仅仅平衡对象创建和发布,或者使用返回自动释放对象的方法是不够的。对象上的每个
retain
必须与
release
平衡。如果你只漏掉一个,那么这个物体就泄漏了Instruments指出了对象的创建位置,但没有指出对象泄漏的位置。Instruments指出了每个保留,但没有(也不能)指出哪个保留未正确平衡

您没有指定实际泄漏的内容,因此我必须根据您的代码给出一个通用示例

让我们假设
basePredicate
正在泄漏:

  • basePredicate泄漏的最简单情况是您根本没有对其调用release。不过,在本例中,您使用返回自动释放对象的方法创建它
  • 下一种可能性是,您将在
    basePredicate
    中为其他对象分配所有权(即,它调用
    retain
    )。那个物体不会释放它
  • 下一种可能性是,您在
    basePredicate
    中给其他对象一份所有权,如上所述,但该对象确实释放了它。对象可能将
    basePredicate
    交给通过保留它来声明其所有权的其他对象
  • 接下来,您授予所有权的对象本身可能正在泄漏
  • 最后三种情况的排列几乎是无限的
  • 如果这听起来很可怕,那就有点可怕了。但解决方法其实很简单:确保每次您的代码使用
    retain
    (或使用retain分配给属性)声明对象的所有权时,它都有相应的所有权收益,即
    release
    autorelease
    (或将nil分配给属性)

    在过去,当我找不到漏洞时,我发现最好的办法是研究哪些物体泄漏,并确定它们之间的关系(如果有的话)。然后我检查我的代码,寻找我还没有发布的对象


    另外,如果您还没有开始使用静态分析器。它无法找到所有这样的问题,但当它找到一个问题时,您将节省大量时间。

    这是iOS还是MacOSX,即GC是否可用?在iOS上开发,不使用GC:)之后如何使用谓词?发布所有代码关于
    self.fetchRequest
    -您如何管理该对象?如果它正在泄漏,那么它保留的任何东西也会泄漏(例如谓词)。我在类的dealloc方法中释放它。因为如果我用这个方法发布它,那么代码就会崩溃。我用:[[NSFetchRequest alloc]init]初始化它