我在以下代码中遇到内存泄漏。在仪器本身崩溃之前,我得到了87.5%的内存泄漏。也许你们其中一个人可以告诉我这段代码有什么问题。我需要在这里发布任何东西吗?感谢。
- (void)browseSSviewControllerDidFinish:(browseSSviewController *)controller {
<SNIP>
MANAGED_OBJECT_1 = [self newFormatFromFormat:MANAGED_OBJECT_2];
<SNIP>
}
- (Format *)newFormatFromFormat:(Format *)formatToCopy {
NSLog(@"making new format that's a copy");
Format *thisNewFormat = [self newBlankFormat];
[self updateFormat:thisNewFormat withNumbersFromFormat:formatToCopy];
return thisNewFormat;
}
-(void)updateFormat:(Format *)formatToCopyTo withNumbersFromFormat:(Format *)formatToCopyFrom {
NSLog(@"copying formats");
formatToCopyTo.x = formatToCopyFrom.x;
formatToCopyTo.y = formatToCopyFrom.y;
formatToCopyTo.z = formatToCopyFrom.z;
formatToCopyTo.a = formatToCopyFrom.a;
formatToCopyTo.n = formatToCopyFrom.n;
formatToCopyTo.u = formatToCopyFrom.u;
formatToCopyTo.s = formatToCopyFrom.s;
}
- (Format *)newBlankFormat {
NSLog(@"making new blank format");
gfghfAppDelegate *del = (gfghfAppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *MOC = del.managedObjectContext;
NSPersistentStoreCoordinator *PSC = [MOC persistentStoreCoordinator];
NSManagedObjectModel *MOM = [PSC managedObjectModel];
NSEntityDescription *entity = [[MOM entitiesByName] objectForKey:@"Format"];
Format *thisNewFormat = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:MOC];
thisNewFormat.slot = [NSNumber numberWithInt:-1];
NSLog(@"slot = %@",thisNewFormat.slot);
return thisNewFormat;
}
这是在仪器崩溃之前我能够从我的回溯中获得的87.5%的泄漏:
+0xc7 calll DYLD-STUB$$objc_msgSend = 87.5%
我没有使用mutableCopy复制我的MANAGED_OBJECT,因为它没有用。
答案 0 :(得分:0)
我重写了newBlankFormat:thisNewFormat方法,并使用了NSEntityDescription的“insertNewObjectForEntityForName:inManagedObjectContext:”方便方法(参见Apple“Core”的“创建和删除托管对象”章节中的“创建,初始化和保存托管对象”)数据编程指南“)。
我认为我的问题最初是我使用“NSManagedObject alloc”和“initWithEntity:insertIntoManagedObjectContext”,它不会生成自动释放的对象。即使我自己从另一个方法使用“释放”时使用获得此方法返回值的实例变量释放它,也会泄漏。但是,无论我是否在malloc周围放置“保留”,释放计数都没有增加,我不相信,因为它不是一个正确的init函数?我不知道为什么。
但是我不在乎,因为以下版本修复了漏洞,事实证明,苹果建议使用它(我想我正在使用示例项目中的旧代码或其他东西)。
这是在新版本的“newBlankFormat:thisNewFormat”函数中修复漏洞的修订:
- (Format *)newBlankFormat:(Format *)thisNewFormat {
NSLog(@"making new blank format");
gfghfAppDelegate *del = (gfghfAppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *MOC = del.managedObjectContext;
//[MOC reset]; don't do this, it will erase MANAGED_OBJECT_2
thisNewFormat = [NSEntityDescription insertNewObjectForEntityForName:@"Format" inManagedObjectContext:MOC]; //this is much better than using the malloc variety
thisNewFormat.slot = [NSNumber numberWithInt:-1];
NSLog(@"slot = %@",thisNewFormat.slot);
return thisNewFormat;
}