说我想创建一个图像数组,我使用了这个:
NSMutableArray *images = [[NSMutableArray alloc]init];
init在这里扮演什么角色?如果我只是使用:
,它将不起作用NSMutableArray *images = [NSMutableArray alloc];
请帮忙。感谢。
答案 0 :(得分:5)
不,你绝对不能只说[NSMutableArray alloc]
。除非该方法是+alloc
方法之一,否则调用将-init...
发送到任何类的结果的方法绝对不正确。所有+alloc
都会保留对象的内存。它基本上等同于调用calloc(sizeof(class), 1)
。 -init
方法对于将对象实际初始化为工作状态至关重要。
答案 1 :(得分:1)
这不仅适用于数组,而且适用于任何可以实例化的Objective-C类:alloc
分配内存来保存实例,但不会在其中放置任何内容,init
实际初始化该内存位置中的一个对象。
答案 2 :(得分:0)
为了在使用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]
。