我正在尝试解决内存泄漏但我找不到任何解决方案。
仪器表示此方法存在泄漏:
- (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。
答案 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];