返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?

Posted

技术标签:

【中文标题】返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?【英文标题】:Should I retain, autorelease or do nothing when returning NSArray of executeFetchRequest: result?返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是什么都不做? 【发布时间】:2011-07-15 00:36:37 【问题描述】:

请看下面的代码:

- (NSArray *)requestEntities:(NSString *)entityName 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                               entityForName:entityName inManagedObjectContext:_context];

    [fetchRequest setEntity:entity]; 

    NSError *requestError = nil;

    NSArray *result = [_context executeFetchRequest:fetchRequest error:&requestError];

    [fetchRequest release], fetchRequest = nil;

    return result;

我需要在其他地方使用结果,在这种方法中,结果是否正确返回(没有保留或自动释放)?另外,它的调用者在得到结果时应该怎么做,保留它还是直接使用它?

谢谢!

【问题讨论】:

【参考方案1】:

约定是您不对由包含newalloccopy 的方法返回的对象负责。您给定的数组几乎肯定已经自动释放,因此当您的代码完成并返回运行循环时它将被释放。如果您需要在该点之后保留数组(例如,如果您想保留这些结果并引用它们以响应未来的 UI 事件),那么您应该保留数组,最好将其分配给保留的属性。

我强烈建议您完整阅读memory management programming guide,或者至少阅读前几节,了解您所询问的内容。

【讨论】:

如果我错了,请纠正我,@zem,但是当您说“...当您的代码完成并返回运行循环时”,您指的是当前方法完成。即,如果您想保留 autoreleased 数组,您应该在该特定方法结束之前这样做。 @chris 不,正如我链接的指南所指出的,您可以毫无问题地将对象返回到其直接调用方法。您通常可以遵循您的代码流程,并确定您的方法结束何时退出您的代码并返回系统;例如,如果您的方法是从 touchesBegan 或其他任何地方调用的,那么最终它将到达 touchesBegan 的末尾,之后自动释放的任何内容都不太可能在下一个 UI 响应中保留。 或者,如果您的代码在 drawRect 或显示链接回调或其他较低级别的代码中,您可以轻松确定何时将控制权交给系统,直到它决定再次运行您的代码。大多数可可应用程序不是脚本。您的代码不是从头到尾直接运行的;它由系统调用以响应时间或 UI 事件。在这些调用之间,默认的自动释放池被耗尽。

以上是关于返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?的主要内容,如果未能解决你的问题,请参考以下文章

返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?

当模型放置在静态库中时,executeFetchRequest 返回类型发生了变化

NSInvalidArgumentException',原因:'executeFetchRequest:错误:

executefetchrequest 导致崩溃

Swift 中的 executeFetchRequest 致命错误

executeFetchRequest 不适用于 propertiesToFetch