0

我曾尝试使用分析工具来查看内存泄漏,而 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,为什么会出现内存泄漏?

4

2 回答 2

2

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

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

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

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

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

或者不调用综合设置器,而是直接分配给_managedObjectContext

_managedObjectContext = [[NSManagedObjectContext alloc] init];

我会推荐前者,因为后者如果_managedObjectContext不是 nil 就会泄漏。但是,如果您确定_managedObjectContext在分配之前为零,您可以选择您想要的任何一个。

于 2012-06-03T12:35:24.917 回答
1

这条线...

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

...将保留计数增加两个,一个用于分配,一个用于属性的“强”。

尝试:

__managedObjectContext = [[NSManagedObjectContext alloc] init];
于 2012-06-03T12:24:11.393 回答