核心数据内存泄漏 - iPhone iOS4

时间:2010-07-14 16:46:11

标签: iphone objective-c core-data memory-leaks

我非常需要帮助解决iPhone应用中的内存泄漏问题。该应用程序已准备好提交到应用程序商店,稳定,在iPhone模拟器或Clang中根本没有内存泄漏...但在我的iPod Touch上似乎很难用它们。

当我尝试从Core Data检索数据时,它们似乎都源于managedObjectModel。

我的应用程序中的核心数据代码是由Xcode自动创建的,我注意到,当你获得xcode生成它时,代码已经改变了......我尝试了旧的和新的但是它没有区别。

如果我注释掉下面的代码,问题就会消失......无论如何都可以看出它有什么问题?到目前为止,我花了9个小时就完成了这件事,而且无法理解!

NSString *entityForName = [[NSString alloc] initWithString:@"OfflineSettings"];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityForName inManagedObjectContext:[self managedObjectContext]];
[request setEntity:entity]; 

[entityForName release];

NSSortDescriptor *sortById = [[NSSortDescriptor alloc] initWithKey:@"Id" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortById]];
[sortById release]; 

NSError *error;
NSMutableArray *mutableFetchResults = [[[self managedObjectContext] executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
    // Handle the error.
    NSLog(@"Error fetching");
}

int intId = -1;

if ([mutableFetchResults count] == 0) {
    TTDERROR(@"No id has been saved to offline settings");      
} else {    
    OfflineSettings *offlineSettings = (OfflineSettings *)[mutableFetchResults objectAtIndex:0];        
    intId = [offlineSettings.Id intValue];
}

[mutableFetchResults release];
[request release];

泄漏具体似乎就在这条线上:

NSMutableArray *mutableFetchResults = [[[self managedObjectContext] executeFetchRequest:request error:&error] mutableCopy];

.. [self managedObjectContext]的代码如果有帮助,如下所示。

- (NSManagedObjectContext *)managedObjectContext {

    if (managedObjectContext_ != nil) {
        return managedObjectContext_;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext_ = [[NSManagedObjectContext alloc] init];
        [managedObjectContext_ setPersistentStoreCoordinator:coordinator];
    }
    return managedObjectContext_;
}

我真的很茫然,所以我会非常感谢你的帮助!

史蒂芬

1 个答案:

答案 0 :(得分:1)

您不需要可变副本。 executeFetchRequest:返回一个自动释放的静态数组,你不会改变数组。 (我一直在看这个。必须在一个例子中。)同样,创建entityForName NSString是没有意义的。只需将字符串文字放在entityForName:中即可消除另一种可能的错误来源。

这些可能是泄漏的可能来源,但无论如何你应该将它们移除。

根据经验,如果您在设备上遇到麻烦但没有模拟器或在一个硬件上而不是其他硬件上,则问题出在库/框架中,该错误发生的硬件未正确编译。确实没有任何类型的编码器错误在一个环境中泄漏而在其他环境中没有泄漏。当我们犯错时,这是普遍的。

图像和声音等资源也可能表现不同,因为不同的设备使用不同的图形和音频硬件。然而,这种情况相当罕见。

如果您通过Instruments运行代码,它应该告诉您究竟哪个对象泄漏。