【问题标题】:Memory leak in cocoa touch with a mutableCopy可可触摸中的内存泄漏与 mutableCopy
【发布时间】:2011-06-18 02:53:45
【问题描述】:

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

仪器说这个方法有泄漏:

 - (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。

【问题讨论】:

  • 您应该格式化您的代码,使其可读。
  • 你能把代码格式化一下吗?另外,你能说一下,仪器说什么吗?请记住,mutablecopy 不会对数组进行深层复制!
  • 它只显示了一个蓝色堆栈上的一个红色堆栈。而且,代码格式正确吗?

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


【解决方案1】:

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];

【讨论】:

  • 它已经给了我想要的结果,但是我需要释放 appDelegate,我不知道在哪里释放它:(
【解决方案2】:

当你这样做时

self.newsArray = something; 

something 被保留,因为您将 retain 添加到 newsArray 属性。

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

解决方案:将分配self.newsArray 的行替换为

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

【讨论】:

  • 秒杀我。 :-)
  • 谢谢mrueg,我认为这行不通,所以我没有尝试过。再次感谢你:D
猜你喜欢
  • 2011-04-19
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
相关资源
最近更新 更多