我迫切需要有关 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_;
}
我真的很茫然,所以我非常感谢您的帮助!
史蒂文
最佳答案
您不需要可变副本。 executeFetchRequest:
返回一个自动释放的静态数组,并且您不会改变该数组。 (我一直看到这个。一定在某个地方的示例中。)同样,创建 entityForName
NSString 是没有意义的。只需将字符串文字放入 entityForName:
中即可消除另一个可能的错误源。
这些都不是可能的泄漏源,但无论如何您都应该将其删除。
根据经验,如果您在设备上遇到问题,但模拟器上没有问题,或者在一个硬件上遇到问题,但在其他硬件上没有问题,则问题出在未针对发生错误的硬件正确编译的库/框架中。实际上,不存在任何类型的编码器错误会在一种环境中泄漏而在其他环境中泄漏的情况。当我们犯错误时,这是普遍的。
图像和声音等资源的行为也可能不同,因为不同的设备使用不同的图形和音频硬件。然而,这种情况相当罕见。
如果您通过 Instruments 运行代码,它应该准确地告诉您哪个对象正在泄漏。
关于iphone - 核心数据内存泄漏 - iPhone iOS4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3248473/