NSMutableArray arrayWithCapacity vs initWithCapacity
我是一个具有广泛Java背景的iPhone / Objective-C新手。
我在Objective-C中学习了更多关于内存管理的知识,并且正在阅读有关内存管理的Apple文档:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
在“对象所有权政策”部分中,它表示您拥有通过以alloc,new或contains开头的方法创建的任何对象。 所有权意味着您需要在完成对象时明确release
对象。
所以我在看NSMutableArray文档:http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html
有两种方法几乎可以做同样的事情......它们都创建一个初始容量的数组。 一个是类方法,另一个是实例方法。
+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;
现在成为懒惰的Java开发人员,为什么我会选择使用类方法的实例方法,因为知道某些时候我必须自己清理一下?
我想我可能在这里错过了一个基本点......是否仅仅是确定对象何时被释放的问题? 类方法中的autorelease
与实例方法中的release
? 我想,在一个资源非常有限的平台(iPhone)上,我应该尽量避免使用类方法,并尽快释放对象?
谢谢!
您通常会根据您是否要拥有该对象而不是当前方法的生命周期(例如,将其分配给静态或直接分配给ivar)来进行选择。 在这种情况下,你可以使用alloc / init方法,因为你知道你已经拥有了它。 如果您打算仅将其用于当前方法的范围,或者将其分配给某个属性进行管理,那么您可能会使用便捷方法。
当你知道你将拥有一个你正在创建的对象时,alloc / init调用总是比ease / retain方法更有效率,因为后者需要基本上alloc / init / autorelease对象,然后你保留它当它返回时。
当你在循环中分配并且不需要/想要处理自动释放池时,你也可以使用直接的alloc / init方法。
arrayWithCapacity:已经应用了autorelease。
initWithCapacity:被明确保留,你需要自己释放它。 由于您通常将其称为[[A alloc] init ...],因此会触发一个灯泡“我需要为此管理内存”,除了“alloc”是“new”和“copy”之外,其他类似的魔术词语你阅读内存管理指南。 但从你的问题来看,你好像理解它的原则。
你是正确的,你应该保持你的内存管理和低,但这并不意味着你需要总是做明确的初始化/释放。 正如Nick所说,使用autorelease工厂方法的一个用例就是当你将它们作为参数传递时。
另一个例子是,当你添加一些东西到类似NSDictionary或NSArray的集合中时,可以使用autorelease工厂方法创建“东西”,因为集合“接管”保留它。 (事物在添加到集合时保留,并在删除时释放。)
你可能会争辩说
Blah *blah = [Blah blahWithSomething];
[myMutableArray addObject:blah];
只是比打字更干净
Blah *blah = [[Blah alloc] initWithSomething];
[myMutableArray addObject:blah];
[blah release];
在第一种情况下,您根本不需要担心释放呼叫。 缺点是,当你在同一个runloop中多次执行这些操作时,如果它是一个在runloop结束时消失的临时/一次性数组对象,则第一种情况下的内存占用量会更大。 但是,如果它是一个循环中没有完成的小对象,并且像常见情况那样保留更长时间,则它们的足迹是相同的。
在这种情况下,我尝试遵守以下规则以避免内存相关(==“非常讨厌”)错误: