迭代NSMutableArray对象。最佳实践

时间:2012-01-26 10:47:15

标签: objective-c nsmutablearray release

在我的应用程序中,我有几个循环访问NSMutableArray的成员以使用它们。这是一个例子:

for (a=0;a<[items count];a++)
{
iItem *item = [[items objectAtIndex:a] autorelease];

    [page.view addSubview:item];

NSLog(@"Item Added: %d\nItem Frame X:%f Y:%f W:%f H:%f",item.itemId,item.frame.origin.x,item.frame.origin.y,item.frame.size.width,item.frame.size.height);

    [item setDelegate:page];

    if ([[items objectAtIndex:a] zOrder] == 1)
        [page.view sendSubviewToBack:item];
    else 
        [page.view bringSubviewToFront:item];

//[item release];
//item = nil;

}

我的问题是,如果我在使用alloc / init和release将其添加到MutableArray后以不同的方法创建了iItem对象,是否必须在使用后使用在循环中创建的iItem上的版本?

感谢。

2 个答案:

答案 0 :(得分:14)

正如 omz 已经指出的那样,你过度释放你的物品。如果您的数组中只有iItem类型的项目,则可以使用快速枚举

for (iItem *item in items)
{
    [page.view addSubview:item];

    NSLog(@"Item Added: %d\nItem Frame X:%f Y:%f W:%f H:%f",item.itemId,item.frame.origin.x,item.frame.origin.y,item.frame.size.width,item.frame.size.height);

    [item setDelegate:page];

    if ([item zOrder] == 1)
        [page.view sendSubviewToBack:item];
    else 
        [page.view bringSubviewToFront:item];
}

答案 1 :(得分:4)

没有。您通过objectAtIndex:访问的项目不是创建的,您只需获得对它的引用,按照惯例,它已经自动释放。因此,如果您要添加自己的autorelease调用,则实际上是过度释放它,这可能会导致指针悬停,导致您的应用崩溃。