分配在方法之间传递的Core Data managedobject时发生内存泄漏

时间:2011-07-07 05:44:59

标签: core-data ios4 xcode4

我在以下代码中遇到内存泄漏。在仪器本身崩溃之前,我得到了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,因为它没有用。

1 个答案:

答案 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;
}