我尝试使用分析工具来查看内存泄漏,而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中发布了它,为什么会有内存泄漏?
发布于 2012-06-03 20:35:25
您的_managedObjectContext泄漏,因为它的保留计数增加了两次,但您只释放它一次。您已经将属性设置为strong,这意味着当对象被分配给它时,它将保留该对象。但您也可以在不自动释放(或手动释放)的情况下分配managedObjectContext。因此,错误在这一行中:
self.managedObjectContext = [[NSManagedObjectContext alloc] init];您分配的对象的保留计数为1,但合成属性将再次保留它,因此它的保留计数为2。当您在取消分配中释放它时,它将保留,因为它的保留计数仍为1。
您需要做的是自动释放您分配的对象:
self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];或者不调用合成的setter,而是直接分配给_managedObjectContext
_managedObjectContext = [[NSManagedObjectContext alloc] init];我建议使用前者,因为如果_managedObjectContext不为零,则后者会泄漏。但是,如果您在赋值之前确定_managedObjectContext为零,则可以选择您想要的任何一个。
发布于 2012-06-03 20:24:11
这行..。
self.managedObjectContext = [[NSManagedObjectContext alloc] init];将保留计数减去两个,一个用于分配,另一个用于属性上的“...increases”。
尝试:
__managedObjectContext = [[NSManagedObjectContext alloc] init];https://stackoverflow.com/questions/10870250
复制相似问题