可可触摸的内存泄漏与mutableCopy

时间:2011-01-30 14:22:04

标签: iphone objective-c cocoa-touch memory-leaks nsmutablearray

我正在尝试解决内存泄漏但我找不到任何解决方案。

仪器表示此方法存在泄漏:

 - (void)refreshData {

 Sn0werSp33dAppDelegate *appDelegate = [[Sn0werSp33dAppDelegate alloc] init];
 NSFetchRequest *coreDataNewsFetchRequest = [[NSFetchRequest alloc] init];
 NSEntityDescription *entity = [NSEntityDescription entityForName:@"News" inManagedObjectContext:managedObjectContext];

 [coreDataNewsFetchRequest setEntity:entity];

 self.managedObjectContext = appDelegate.managedObjectContext;
 self.newsArray = [[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest error:nil] mutableCopy];//Intruments says that here is the memory leak :(


 [appDelegate release];
 [coreDataNewsFetchRequest release];
 [entity release];
}

newsArray在我的.h中声明为NSMutableArray,它有一个属性: @property (nonatomic, retain) NSMutableArray *newsArray;

我尝试了很多东西,但在任何时候,事情都没有用。 我正在使用iPhone SDK 4.2.1和Instruments 2.7运行XCode 3.2.5。

2 个答案:

答案 0 :(得分:12)

当你这样做时

self.newsArray = something; 

保留something,因为您已将retain添加到newsArray媒体资源中。

mutableCopy也会返回一个保留计数增加1的对象。因此,在方法完成后,您的newsArray的保留计数比您真正想要的高一个,即内存泄漏检测到了。

解决方案:将<{1}}指定的行替换为

self.newsArray

答案 1 :(得分:3)

mutableCopy制作副本并保留它,因此您需要发布您创建的副本。尝试更改此内容:

self.newsArray = [[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest 
                                                      error:nil] mutableCopy];

对此:

self.newsArray = [[[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest 
                                                       error:nil] mutableCopy] autorelease];

顺便说一句,创建app delegate类的新对象有点不寻常,可能无法给出您期望的结果。通常,您实例化一个应用程序委托(默认情况下,这是在MainWindow.xib中为您完成的),然后在整个应用程序中使用以下内容引用它:

FooAppDelegate *appDelegate = (FooAppDelegate*)[[UIApplication sharedApplication] delegate];