gpt4 book ai didi

objective-c - 在 Objective C 中,为什么我的核心数据对象永远不会被释放?

转载 作者:太空狗 更新时间:2023-10-30 03:59:53 27 4
gpt4 key购买 nike

我在释放 m 个核心数据对象时遇到了很多麻烦。我什至尝试了我能想到的最简单的测试,我观察了保留计数,它似乎总是比我预期的要高。我还在核心数据对象的 dealloc 例程上放置了一个断点,它似乎没有被调用(至少没有,除非我特别添加额外的版本)。

顺便说一句,我肯定有 [managedObjectContext setRetainsRegisteredObjects:NO],所以这不是问题。

这是我试过但行不通的例子:

MobileObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"MobileObject" inManagedObjectContext:managedObjectContext];

NSLog(@"Object count after creation %d", [obj retainCount]);

NSError *error;
[managedObjectContext save:&error];

NSLog(@"Object count after saving %d", [obj retainCount]);

每条日志消息打印出“2”。 Dealloc 永远不会被调用。我希望保存会导致对象被释放(或自动释放),因为核心数据应该意识到它不需要保留。在那种情况下,如果有两个自动释放(一个来自创建,一个来自保存),保留计数 2 是有意义的,但情况似乎并非如此。如果我添加

[obj release] 

在我的测试结束时,dealloc 例程将被正确调用,但我很困惑为什么我需要这个版本。

最佳答案

保存 CoreData 上下文与释放 NSManagedObject 在逻辑上相关。

在大型程序中,在程序运行时一直拥有托管对象上下文 (moc) 是很常见的。对象被添加到反射(reflect)用户操作的上下文中或从上下文中删除,并且上下文也会偶尔保存一次,以便内存中的上下文与文件中的内容同步。但是在这种情况下,保存上下文并不意味着您已经完成了上下文;您仍然保留上下文并像保存之前一样使用它。所以,保存并不意味着释放对象。

所以,如果你想释放你保留的对象,你需要显式地释放它们。

但是在这种情况下,insertNewObjectForEntityName:inManagedObjectContext: 返回一个autoreleased 对象作为written here .因此,除非您明确保留该对象,否则您不拥有该对象。如果你没有保留,你不应该释放它。它被释放并在适当的时候自动调用 dealloc

请注意,您永远不应依赖 retainCount 来查看发生了什么。对于一个简单的对象,retainCount 的数量符合我们的预期,但对于像 NSManagedObject 这样复杂的对象,框架本身需要跟踪很多事情,所以可能会在幕后做很多retain。例如,即使您没有明确保留一个对象,它也可能与您拥有的另一个对象存在关系;或者 CoreData 可能只是决定将对象保留在内存中以对其进行缓存。

唯一要记住的是遵守标准的所有权规则。如果您alloc/initretain,稍后您将releaseautorelease

回答你在评论中的问题,让我在这里说明基本原则:如果对象 x 需要另一个对象 ax retains a。当x 使用完a 时,x releases a。每个对象 x 都应遵循此过程,无论 x 是您编写的对象还是 Apple 框架提供的对象。如果每个对象都遵循这个原则,就没有泄漏。因此,您看不到的 Apple 代码如下所示。您的代码也应该遵循这一点。

这回答了你的问题:

when I "add" a child object to a parent does the parent object automatically retain the object I added?

是的。父级需要它,所以保留它。

And if I then release the parent object will it release the child or to I have to do that explicitly?

是的,父级确实释放了子级,因为当父级被dealloced 时,它完成了对子级的使用,因此子级被释放

这些要点通常不会写在各个方法的文档中,因为作为规则,每个 API 都遵循这个基本的内存管理原则,因此没有必要拼写出来。

我们鼓励您阅读 Memory Manegement Rules .

关于objective-c - 在 Objective C 中,为什么我的核心数据对象永远不会被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3330253/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com