0

我有以下代码:

@interface MyClass : NSObject
{
    NSMutableArray *items;
}
@end


@implementation MyClass

-(Item *)getItem
{
    if(items.count < 1)
    {
        [self buildItemsArray];
    }
    Item *item =  [[[items objectAtIndex:0]retain]autorelease];
    [items removeObjectAtIndex:0];
    return item;
}

-(void)buildItemsArray
{
    // ...
    [items addItem:someNewItem];
    [items addItem:someOtherNewItem];
}
@end

我有一个返回项目的函数。如果项目下降到 0,则项目数组在 buildItemsArray 中再次构建。我的游戏逻辑要求当我返回一个项目时,我需要将它从数组中移除。因此,我使用了一个保留来确保该项目在返回行之前有效(因为唯一的其他已知保留发生在将该项目添加到项目数组时发生),并使用一个自动释放来确保它稍后被清理。我检查了这段代码既没有崩溃也没有泄漏。我怀疑是否:

a) 没关系 - 我问的原因是我主要看到了使用 alloc/init/autorelease 的代码,而没有遇到使用 retain/autorelease 的这种情况 b) 是否有一些理由改为使用 alloc/init/autorelease:

Item *item =  [[Item alloc]initWithItem:[items objectAtIndex:0]autorelease];

谢谢

4

1 回答 1

2

This is generally ok:

Item *item = [[[items objectAtIndex:0] retain] autorelease];
[items removeObjectAtIndex:0];
return item;

Though this would make the intent clearer (returning an autoreleased object):

Item *item = [[items objectAtIndex:0] retain];
[items removeObject:item];
return [item autorelease];

No reason to alloc/init. That just adds unnecessary overhead.

Like I said in my comment, if this is a (relatively) new project, you really really really should be using ARC and not worry about these things anymore.

于 2013-03-03T20:44:56.333 回答