2010-07-14 120 views
2

我非常需要帮助,在我的iPhone应用程序中发生内存泄漏。该应用程序已准备好提交到应用程序商店,是稳定的,在iPhone模拟器或叮当中根本没有任何内存泄漏......但似乎与我的iPod Touch上的它们充满了矛盾。核心数据内存泄漏 - iPhone iOS4

当我尝试从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]; 

..和[自managedObjectContext]的代码是如在情况下,它可以帮助如下..

- (NSManagedObjectContext *)managedObjectContext { 

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

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

我真的很茫然,所以我会很感激一些帮助!

Steven

+0

我不明白这条线是如何特别引起泄漏的,但你为什么做一个可变的副本?您根本不需要修改数组,只需访问它,然后释放它。另外,你如何检测iPod上的泄漏,但不是在模拟器中? – bobDevil 2010-07-14 16:59:19

+0

嘿, mutableCopy在我最初从它复制的示例代码中。我已经尝试过,并且摆脱了随附的版本,但它没有帮助。 我使用仪器检测iPod上的泄漏。 谢谢, – 2010-07-14 17:13:13

回答

1

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

以上这些都可能是泄漏的原因,但你应该删除它们。作为一个经验法则,如果你在设备上有麻烦,但不是在模拟器上,或者在一个硬件上而不是在其他硬件上,那么问题出在一个库/框架中,因为发生错误的硬件没有正确编译。真的没有任何类型的编码器错误在一个环境中泄漏,而不是其他类型。当我们犯了一个错误,这是普遍的。

由于不同的设备使用不同的图形和音频硬件,图像和声音等资源的行为也会有所不同。然而,这很少见。

如果你通过Instruments运行代码,它应该告诉你到底是哪个对象在泄漏。

+0

我一直在看'mutableCopy'的东西。希望我们中的一个能够追踪它的来源,因为它跟我一直看到的那个演员一样愚蠢。 – 2010-07-14 19:16:50

+0

好的,谢谢TechZen ...这就是我喜欢的那种建议,明确的!即“实际上没有任何类型的编码器错误在一个环境中泄漏,而不是在其他环境中泄漏。当我们犯了一个错误,它是通用的“ 所以在那个逻辑上,因为我的代码在模拟器中没有内存泄漏的情况下工作,所以我没有犯一个编码错误 你可以扩展所有的正确或错误如何编译iPhone/iPod设备的框架?...和/或如何检测项目中使用的框架/库之一何时被错误地编译? 在miunute中,我的项目使用了很少的框架/库 再次感谢 – 2010-07-14 22:54:49

+0

哦,我一直在通过仪器运行代码,这就是我如何知道我有一个泄漏... 泄漏的对象:GeneralBlock4096 负责任的图书馆:基金会 负责任的框架:NSPushAutoreleasePool ..如果我考虑扩展的细节,它会导致下来: [AppDelegate中managedObjectContext] [AppDelegate中persistentStoreCoordinator] [AppDelegate中managedObjectModel] – 2010-07-14 23:05:04