建议初始化数组(或其他对象)的最佳方法

时间:2009-11-16 05:45:10

标签: iphone objective-c memory-management initialization

我对以下两种初始化方式感到有点困惑.....

方式1:

- (void) myMethod{

    NSArray *myArray = [[NSArray alloc] initWithObjects:obj1,obj1,nil];
    [self setClassArray:myArray];
    [myArray release];
}

方式2:

- (void) myMethod{

NSArray *myArray = [NSArray arrayWithObjects:obj1,obj2,nil];
[self setClassArray:myArray];
}

在方法1中,我使用了一个alloc init方法,这是一个实例方法,因为我使用了一个alloc语句,我必须自己释放数组。

在第2种方式中,我使用了一个静态方法来初始化数组,因为没有使用alloc语句,所以我不需要释放系统将处理的内存。

方式1,耗时并且如果不小心可能导致内存泄漏

方式2,写作速度更快,你不需要处理内存泄漏

但是,我仍然看到标准源代码中使用的way1比way2更常见。我不知道为什么人们这样做,或者我在某个地方做错了。

欢迎回答和评论。请提出最好的编程习惯。

4 个答案:

答案 0 :(得分:5)

您的第二个示例使用便捷构造函数,该构造函数返回一个自动释放的对象。那么问题是,使用autoreleasealloc / release是否更好。 mmalcanswer on this StackOverflow thread解释了自动释放对象的缺点。 (基本上,尽可能使用alloc / release。)

另外(这可能说明显了),某些类可能没有方便构造函数,因此在使用这些类时,您必须使用alloc / release

答案 1 :(得分:1)

据我所知,

[NSArray arrayWithObjects:obj1,obj2,nil];

返回一个自动释放的对象,类似于

[[[NSArray alloc] initWithObjects:obj1,obj1,nil] autorelease];

我不想用自动释放池来管理内存。也许这只是一种偏见))

答案 2 :(得分:1)

使用方法2(自动释放)时,如果操作系统认为没有引用,则释放该对象。 但是当您使用手动版本时,在您输入代码时,您可以直接或随时发布。

答案 3 :(得分:0)

我通常更喜欢第二种方式,如果我没记错的话,这也是Apple文档推荐的内容(尽可能使用autorelease)。

在方式1中,内存释放得更快,因此如果你有一个循环或递归调用的方法,使用自动释放可能会积累很多内存,而alloc / retain会使你的内存占用率降低。

另一方面,我认为使用自动释放更有效,因为自动释放池可以同时释放大块内存,而不是一次又一次地释放小块。我在这里可能错了。