使用arrayWithCapacity有什么好处

arrayWithCapacityNSArray.h中定义的一个方法,在NSArray.m中实现

当我看GNUStep提供的代码时,我可以得到这个arrayWithCapacity是一个调用initWithCapacity的普通方法:

 + (id) arrayWithCapacity: (NSUInteger)numItems { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithCapacity: numItems]); } 

initWithCapacity是一个简单的方法,只有自我初始化。

 - (id) initWithCapacity: (NSUInteger)numItems { self = [self init]; return self; } 

内存分配与执行的项目数量无关。
使用arrayWithCapacity方法的优点是什么? 简单地使用[[NSArray alloc] init]更好吗?

期望的是,提供一个明确的大小可以提高内存分配,因为在添加项目时不需要调整数组的大小。 在实践中,这只是一个暗示,有一些证据表明它并没有被实际使用(参见关于基础集合类的objc.io文章 )。

这些方法实际上是NSMutableArray一部分,而不是NSArray

它为实现提供了一个有关您想要存储多less项目的提示,以便它可以预先分配足够的内存,而不是根据需要增加内存,这可能很昂贵,因为它可能涉及分配,从旧内存复制到新的,释放旧的记忆。 如果你添加了很多项目,这个增长可能会发生很多,所以如果NSMutableArray可以一次性分配所需的内存量,效率会更高。

请记住,这只是一个提示,实现可能会忽略它。 实际上, CFArray/CFMutableArray 在创build可变数组时 不会忽略容量:

 static CFArrayRef __CFArrayInit(CFAllocatorRef allocator, UInt32 flags, CFIndex capacity, const CFArrayCallBacks *callBacks) { struct __CFArray *memory; UInt32 size; ... switch (__CFBitfieldGetValue(flags, 1, 0)) { case __kCFArrayImmutable: size += capacity * sizeof(struct __CFArrayBucket); break; case __kCFArrayDeque: case __kCFArrayStorage: break; } ... return (CFArrayRef)memory; } CFMutableArrayRef CFArrayCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFArrayCallBacks *callBacks) { ... return (CFMutableArrayRef)__CFArrayInit(allocator, __kCFArrayDeque, capacity, callBacks); } 

根据这篇由@azsromej链接的文章, NSMutableArray也似乎忽略了提示。

这适用于NSMutableArray因为NSArray没有方法arrayWithCapacity ,这也适用于initWithCapacity

从运行时间的POV中使用arrayWithCapacity好处是微不足道的。 这可以被认为是一个不成熟的优化。

它有一个缺点,或者需要花费一定的时间和/或代码来提供一个很less提供有意义的时间优势和增加精神负担的价值。

它也被认为是一个暗示,可能或不会被使用,这是苹果可以改变的一个实现细节。

注意:我已经进行了时间testing,没有容量提示,节省的时间,如果有的话,是一个非常小的百分比。

另请参阅ridiculousfish以获取有关NSArray更多信息。

@bbum评论:“docs简单状态build立初始容量不是数组已经分配内存来保存所有的容量,数组的后备存储不是线性分配的内存块,而是细节随着数组的大小而变化。