假设我想创建一组图像,我使用了这个:
NSMutableArray *images = [[NSMutableArray alloc]init];
init 在这里真正扮演什么角色?如果我简单地使用它不会工作:
NSMutableArray *images = [NSMutableArray alloc];
请帮忙。谢谢。
假设我想创建一组图像,我使用了这个:
NSMutableArray *images = [[NSMutableArray alloc]init];
init 在这里真正扮演什么角色?如果我简单地使用它不会工作:
NSMutableArray *images = [NSMutableArray alloc];
请帮忙。谢谢。
不,你绝对不能只说[NSMutableArray alloc]
。+alloc
对发送到任何类的结果调用方法是绝对不正确的,除非该方法是其中一种-init...
方法。+alloc
所做的只是为对象保留内存。它基本上相当于调用calloc(sizeof(class), 1)
. 该-init
方法对于将对象实际初始化为工作状态至关重要。
这不仅适用于数组,也适用于任何可以实例化的 Objective-C 类:alloc
分配内存来保存实例,但不往里面放任何东西,init
实际上在那个内存位置初始化一个对象。
尽管在某些情况下,Objective-C 内部有很多“混搭”来使方案短路,但在理论模型alloc
中,仅为对象创建(从堆分配)空间。空间的内容本质上是随机的——前一个对象留下的任何东西都占据了那个位置。
之后alloc
,init
以特定于类的方式初始化空间。对于 NSMutableArray,这意味着创建了一个标头(其中的第一部分实际上是通过对 NSObject的super
调用创建的),并且初始化了正在使用的数组条目数之类的东西。init
请注意,对于 NSMutableArray,您可以调用array
“方便”方法而不是alloc/init
, 来执行[[[NSMutableArray alloc] init] autorelease]
. 对于任何类,您都可以调用new
“方便”方法来执行等效的[[SomeClass alloc] init]
.
为了在使用 NSMutableArrays 时获得最佳性能,您总是希望使用initWithCapacity:25
或附近。这为合理数量的行或条目清除了足够的内存。如果你把它留在初始化,我相信它会初始化到初始容量 0,这意味着你每次添加东西时都必须分配新的内存,这会损害你的应用程序的性能。