NSMutableArray对象上的迭代.最佳实践



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

for (a=0;a<[items count];a++)
{
iItem *item = [[items objectAtIndex:a] autorelease];
    [page.view addSubview:item];
NSLog(@"Item Added: %dnItem 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上使用释放?

谢谢。

正如omz已经指出的,您过度发布了您的物品。如果数组中只有iItem类型的项,则可以使用快速枚举:

for (iItem *item in items)
{
    [page.view addSubview:item];
    NSLog(@"Item Added: %dnItem 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];
}

否。您通过objectAtIndex:访问的项目不是创建的,您只是得到了一个引用,根据约定,该引用已经自动发布。因此,如果你添加了自己的autorelease调用,实际上你已经过度释放了,这可能会导致指针悬空,从而导致你的应用程序崩溃。

最新更新