释放由函数创建的对象

时间:2011-08-10 15:23:32

标签: objective-c memory-management

我正在学习obj-c,我对内存管理有疑问:

假设我有一个返回NSDictionary的函数,“fDictionary”,

NSDictionary *fDictionary {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithInt:1], @"blah",nil];
return dict
} 

由特定方法调用:

-(int)fNumber {
  NSDictionary *f = fDictionary();
  return [[f objectForKey:@"blah"] intValue];
}

我不清楚的是我应该如何/在哪里发布NSDictionary对象。

我应该在方法中释放它,还是在函数中自动释放它?

5 个答案:

答案 0 :(得分:3)

如果函数写得正确,则字典会自动释放,因此您根本不必释放它。它将很快由自动释放池发布。

您只发布自己保留或复制的内容。这些是你“拥有”的东西。一定不要过早发布它们。通常的观点是在它们被分配或保留的函数结束之前,如果它们是本地的。如果它们是ivars,那么最好的一点通常是ivar所属类的dealloc。

答案 1 :(得分:1)

在不了解fDictionary的情况下,很难确定,但大多数对象C代码遵循的惯例如下:

  • 如果实例是使用alloccopy
  • 创建的,那么您拥有它
  • 如果你retain
  • ,你拥有它
  • 否则你不拥有它

如果你不拥有它,你不应该release

因此按照惯例,该函数将返回一个autorelease d对象,您的方法中不需要任何额外的管理。

答案 2 :(得分:1)

一般规则是,如果您的代码分配了某些内容,则需要释放或自动释放它。

如果这是其他人的功能,你会希望返回的字典是自动释放的 - 这就是惯例。我会确保fDictionary返回一个自动释放的NSDictionary。

答案 3 :(得分:0)

如果您收到名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法中的对象,则必须释放或自动释放它。否则它已经自动释放。

如果您保留了某些内容,则必须将其释放,其他任何内容都不会为您执行此操作。

每个Obj-C程序员都必须阅读Memory Management Guide

答案 4 :(得分:0)

没有

NSDictionary dictionaryWithObjectsAndKeys:(实际上只是[[[NSDictonary alloc]initWithObjectsAndKeys:, nil]autorelease])会返回自动释放的NSDictionary。这意味着当计算机决定不再需要它时,将自动释放字典。

如果在fDictionary()字典中alloc,则需要手动释放它。总是从函数/方法返回自动释放的对象是经验法则,因此函数/方法的用户不必担心内存管理。