是否可以同时保留和自动释放?

时间:2013-03-03 17:43:46

标签: objective-c memory-management

我有以下代码:

@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,那么items数组将在buildItemsArray中再次构建。我的游戏逻辑要求当我返回一个项目时,我需要将它从数组中删除。因此,我使用retain来确保该项有效直到返回行(因为当项目被添加到items数组时,唯一的其他已知保留发生),并且自动释放以确保它稍后被清除。我已经检查过这段代码既没有崩溃也没有泄漏。我想知道是否:

a)这没关系 - 我问的原因是我主要看到带有alloc / init / autorelease的代码,并且没有使用retain / autorelease遇到这种情况 b)是否有一些理由来分配/ init / autorelease:

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

由于

1 个答案:

答案 0 :(得分:1)

这通常没问题:

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

虽然这会使意图更清晰(返回自动释放的对象):

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

没有理由分配/ init。这只会增加不必要的开销。

就像我在评论中所说,如果这是一个(相对)新项目,你真的应该使用ARC而不再担心这些事情。