2011-01-30 49 views
1

我试图解决内存泄漏,但我找不到任何解决方案。可变触摸与mutableCopy内存泄漏

仪器说有这个方法泄漏:

- (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和仪器2.7运行XCode 3.2.5。

+0

你应该格式化你的代码,以便它的可读性。 – 2011-01-30 14:23:03

+0

你可以请格式化一些代码?此外,你可以说,什么工具说?请记住,mutablecopy不会构成数组的深层副本! – Icky 2011-01-30 14:24:23

+0

它只是显示一个蓝色的红色堆栈。而且,该代码格式正确吗? – AppleL1nk 2011-01-30 19:09:49

回答

12

当你

self.newsArray = something; 

something被保留,因为您添加retainnewsArray财产。

mutableCopy也返回一个保留计数增加1的对象。所以在该方法结束后,您的newsArray保留计数比您真正想要的高一个,即检测到的内存泄漏。

解决方法:在您指定self.newsArray

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

mutableCopy使得副本,并保留它,所以你需要释放你所创建的副本替换行。尝试修改此:

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

要这样:一边

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

作为,创建您的应用程序委托类的新对象是有点不寻常,可能不会给你所期望的结果。传统上您实例化一个应用程序委托(默认情况下这是在MainWindow.xib中为你做),然后使用是指它在你的应用程序:

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