当我通过autorelease解决这个潜在的泄漏我的应用程序崩溃,为什么?

时间:2011-07-07 10:24:47

标签: iphone xcode memory-leaks

analyze函数告诉我mutableFetchResults这里有潜在的泄漏:

- (NSMutableArray *) getBookmarks
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bookmark" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
[request release];


if (!mutableFetchResults) {
    NSLog(@"Error with fetch: %@", error );
    return nil;
}

return mutableFetchResults ;

}

像这样有效,但有泄漏警告 当我使用自动释放NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];我的应用程序崩溃而没有错误日志 我怎样才能在这里找到问题?

- (id)init
{
self = [super init];
if (self) {

    coreDataManager = [[CoreDataManager alloc] initWithDelegate:self];
    bookmarks = [coreDataManager getBookmarks];
  }
return self;
}

2 个答案:

答案 0 :(得分:1)

您需要保留任何想要保留的内容,因此init方法需要保留书签:

bookmarks = [[coreDataManager getBookmarks] retain];

然后,您可以在返回之前自动释放mutableFetchResults变量。

此外,Cocoa命名约定将具有名为getBookmarks的{​​{1}}方法。 :)

答案 1 :(得分:0)

当你说:

时,你是什么意思
  

当我使用autorelease时NSMutableArray * mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:& error] mutableCopy];我的应用程序在没有错误日志的情况下崩溃。

......那里没有自动释放。 mutableCopy会保留数组的副本,保留计数为1.