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