【问题标题】:Iteration over NSMutableArray objects. Best Practice迭代 NSMutableArray 对象。最佳实践
【发布时间】:2012-02-19 11:30:36
【问题描述】:

在我的应用程序中,我有几个循环访问 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 使用释放?

谢谢。

【问题讨论】:

    标签: objective-c nsmutablearray release


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-02-18
        • 1970-01-01
        • 2011-07-12
        • 2011-12-27
        • 1970-01-01
        • 2013-03-28
        • 2015-01-13
        • 2014-06-16
        • 2021-07-31
        相关资源
        最近更新 更多