返回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】:约定是您不对由包含new
、alloc
或copy
的方法返回的对象负责。您给定的数组几乎肯定已经自动释放,因此当您的代码完成并返回运行循环时它将被释放。如果您需要在该点之后保留数组(例如,如果您想保留这些结果并引用它们以响应未来的 UI 事件),那么您应该保留数组,最好将其分配给保留的属性。
我强烈建议您完整阅读memory management programming guide,或者至少阅读前几节,了解您所询问的内容。
【讨论】:
如果我错了,请纠正我,@zem,但是当您说“...当您的代码完成并返回运行循环时”,您指的是当前方法完成。即,如果您想保留autoreleased
数组,您应该在该特定方法结束之前这样做。
@chris 不,正如我链接的指南所指出的,您可以毫无问题地将对象返回到其直接调用方法。您通常可以遵循您的代码流程,并确定您的方法结束何时退出您的代码并返回系统;例如,如果您的方法是从 touchesBegan
或其他任何地方调用的,那么最终它将到达 touchesBegan 的末尾,之后自动释放的任何内容都不太可能在下一个 UI 响应中保留。
或者,如果您的代码在 drawRect 或显示链接回调或其他较低级别的代码中,您可以轻松确定何时将控制权交给系统,直到它决定再次运行您的代码。大多数可可应用程序不是脚本。您的代码不是从头到尾直接运行的;它由系统调用以响应时间或 UI 事件。在这些调用之间,默认的自动释放池被耗尽。以上是关于返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?的主要内容,如果未能解决你的问题,请参考以下文章
返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?
当模型放置在静态库中时,executeFetchRequest 返回类型发生了变化
NSInvalidArgumentException',原因:'executeFetchRequest:错误: