【问题标题】:Is this function producing any memory leak?这个函数会产生任何内存泄漏吗?
【发布时间】:2012-12-12 12:20:23
【问题描述】:
+ (NSArray *) fetchAllContactsInContext:(NSManagedObjectContext *)a_context
{
    NSFetchRequest *_request = [[NSFetchRequest alloc] init];
    [_request setEntity:[NSEntityDescription entityForName:@"Contact" inManagedObjectContext:a_context]];

    NSSortDescriptor *_sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
    NSArray *_sortDescriptors = [[NSArray alloc] initWithObjects:_sortDescriptor, nil];
    [_request setSortDescriptors:_sortDescriptors];

    NSError *_fetchError=nil;
    NSArray *_results = [[NSArray alloc] initWithArray:[a_context executeFetchRequest:_request error:&_fetchError]];
    [_sortDescriptor release];
    [_sortDescriptors release];
    [_request release];

    if (_fetchError){
        NSLog(@"Contact - Error fetching contacts %@", [_fetchError localizedDescription]);
    }
    [_fetchError release];
    return [_results autorelease];
}

我想问一下,这个函数是不是内存泄露了?实际上 Instruments 是说这个函数正在泄漏大量内存。

你能帮我解决内存问题吗?

【问题讨论】:

  • 注意:不要测试_error来判断是否有错误,测试_results,如果没有错误则无法保证值..还有,这几天前导下划线“ _" 通常只用于 iVar,这有助于其他人阅读您的代码。当然,对于 ARC,所有这些都是名词问题。
  • 我认为你不需要发布_fetchError。否则,任何调用 this 都可能导致返回值泄漏。尝试运行 Product->Analyze 以查看是否有警告...或切换到 ARC。 :-)

标签: objective-c memory-management memory-leaks instruments


【解决方案1】:

如果您需要查看对象的保留、释放和自动释放发生的位置,请使用工具:

在仪器中运行,在分配中将“记录引用计数”设置为开启(您必须停止记录才能设置选项)。导致问题代码运行,停止记录,搜索感兴趣的 ivar,向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

这是一个使用 ARC for iOS 4.3 及更高版本的简化版本:

+ (NSArray *) fetchAllContactsInContext:(NSManagedObjectContext *)aContext {
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
    [request setSortDescriptors:@[sortDescriptor]];

    NSError *fetchError;
    NSArray *results = [aContext executeFetchRequest:request error:&fetchError];

    if (results == nil){
        NSLog(@"Contact - Error fetching contacts %@", [fetchError localizedDescription]);
    }
    return results;
}

【讨论】:

  • 是否需要更改项目设置才能使用 ARC?或者重构这个文件会起作用吗?目前我的项目是 NON-ARC 项目。
  • 是否使用 ARC 是个人喜好,我选择在我的项目中使用 ARC。您可能会寻找另一个关于如何转换为 ARC 的 SO 答案。
【解决方案2】:

为什么有[_fetchError release];

你为什么不使用 ARC?

尝试将此代码重构为 ARC。

【讨论】:

  • 是否需要更改项目设置才能使用 ARC?或者重构这个文件会起作用吗?目前我的项目是 NON-ARC 项目。
  • 重构它,它会自动转换为ARC。而在arc release、retain、copy、autorelease和编译器自己实现。所以没有泄漏和僵尸的机会。
  • 是否需要更改项目设置才能使用 ARC?
  • 它会减少你的麻烦,但你应该注意可可内存管理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多