NSMutableArray对象的迭代。最佳实践

4

在我的应用程序中,我有几个循环,在这些循环中访问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创建了iItem对象,并在将其添加到MutableArray后进行了释放,那么在循环中创建的iItem在使用后是否需要释放?
谢谢。
2个回答

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];
}

4
不。通过objectAtIndex:访问的项并没有被创建,你只是获取到一个引用它的指针,根据惯例,这个指针已经自动释放了。因此,如果你添加了一个autorelease调用,实际上你会过度释放它,这可能导致悬空指针并可能导致应用程序崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接