发布managedObjectContext对象c

时间:2012-06-03 12:18:49

标签: iphone ios memory-leaks dealloc

我曾尝试使用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中发布了它,为什么会出现内存泄漏?

2 个答案:

答案 0 :(得分:2)

您的_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不是零,后者会泄漏。但是,如果您确定_managedObjectContext在作业之前为零,则可以选择任意一个。

答案 1 :(得分:1)

这一行...

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

...将保留计数增加2,一个用于alloc,一个用于属性上的“strong”。

尝试:

__managedObjectContext = [[NSManagedObjectContext alloc] init];