创建数组时init的作用

时间:2012-07-13 20:04:36

标签: objective-c xcode cocoa-touch

说我想创建一个图像数组,我使用了这个:

NSMutableArray *images = [[NSMutableArray alloc]init];

init在这里扮演什么角色?如果我只是使用:

,它将不起作用
NSMutableArray *images = [NSMutableArray alloc];

请帮忙。感谢。

4 个答案:

答案 0 :(得分:5)

不,你绝对不能只说[NSMutableArray alloc]。除非该方法是+alloc方法之一,否则调用将-init...发送到任何类的结果的方法绝对不正确。所有+alloc都会保留对象的内存。它基本上等同于调用calloc(sizeof(class), 1)-init方法对于将对象实际初始化为工作状态至关重要。

答案 1 :(得分:1)

这不仅适用于数组,而且适用于任何可以实例化的Objective-C类:alloc分配内存来保存实例,但不会在其中放置任何内容,init实际初始化该内存位置中的一个对象。

答案 2 :(得分:0)

Apple Reference

为了在使用NSMutableArrays时获得最佳性能,您总是希望使用initWithCapacity:25或其左右。这样可以为合理数量的行或条目清除足够的内存。如果你把它保留在init,我相信它会初始化为初始容量0,这意味着你每次添加内容时都必须分配新的内存,这会损害你的应用程序的性能。

答案 3 :(得分:0)

尽管在某些情况下Objective-C中存在大量“swizzles”来使方案短路,但在理论模型中alloc仅为对象创建(从堆分配)空间。空间的内容基本上是随机的 - 无论是从前一个对象遗留下来占据该位置的内容。

alloc之后,init以特定于类的方式初始化空间。对于NSMutableArray,这意味着创建了一个标头(其第一部分实际上是由super对NSObject的init调用创建的),并且初始化了正在使用的数组条目数。

请注意,对于NSMutableArray,您可以调用array“便利”方法而不是alloc/init,以执行等效的[[[NSMutableArray alloc] init] autorelease]。对于任何类,您都可以调用new“方便”方法来执行等效的[[SomeClass alloc] init]