gpt4 book ai didi

iphone - 释放 managedObjectContext 对象 c

转载 作者:行者123 更新时间:2023-11-28 20:35:03 25 4
gpt4 key购买 nike

我曾尝试使用 Analyze 工具查看内存泄漏,Xcode 在这一点上给我一个内存泄漏:

.h

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

.m

@synthesize managedObjectContext = __managedObjectContext;

然后在代码中我这样做:

AppDelegate *appController = [[UIApplication sharedApplication] delegate];

self.managedObjectContext = [[NSManagedObjectContext alloc] init];
[self.managedObjectContext setUndoManager:nil];
[self.managedObjectContext setPersistentStoreCoordinator: [appController persistentStoreCoordinator]];

dealloc 中:

- (void)dealloc
{
[__managedObjectContext release];
[super dealloc];
}

它让我在这一行发生内存泄漏:

[self.managedObjectContext setUndoManager:nil];

对于这个对象:

self.managedObjectContext = [[NSManagedObjectContext alloc] init];

我已经在dealloc中释放了,为什么会出现内存泄漏?

最佳答案

您的 _managedObjectContext 泄漏是因为它的保留计数增加了两次,但您只释放了一次。您已将您的属性设置为 strong,这意味着它将在分配给它时保留该对象。但是您也可以在不自动释放(或手动释放)的情况下分配 managedObjectContext。因此错误在这一行:

self.managedObjectContext = [[NSManagedObjectContext alloc] init];

您分配的对象的保留计数为 1,但合成属性会再保留一次,因此保留计数为 2。当您在 dealloc 中释放它时,它会保留下来,因为它仍然有保留计数为 1。

您需要做的是或者自动释放您分配的对象:

self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];

或者不调用合成setter,而是直接赋值给_managedObjectContext:

_managedObjectContext = [[NSManagedObjectContext alloc] init];

我会推荐前者,因为如果 _managedObjectContext 不是 nil,后者会泄漏。但是,如果您确定 _managedObjectContext 在赋值之前为 nil,您可以选择任何一个。

关于iphone - 释放 managedObjectContext 对象 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870250/

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