我正在学习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对象。
我应该在方法中释放它,还是在函数中自动释放它?
答案 0 :(得分:3)
如果函数写得正确,则字典会自动释放,因此您根本不必释放它。它将很快由自动释放池发布。
您只发布自己保留或复制的内容。这些是你“拥有”的东西。一定不要过早发布它们。通常的观点是在它们被分配或保留的函数结束之前,如果它们是本地的。如果它们是ivars,那么最好的一点通常是ivar所属类的dealloc。
答案 1 :(得分:1)
在不了解fDictionary
的情况下,很难确定,但大多数对象C代码遵循的惯例如下:
alloc
或copy
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
,则需要手动释放它。总是从函数/方法返回自动释放的对象是经验法则,因此函数/方法的用户不必担心内存管理。