2013-03-03 44 views
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中。我的游戏逻辑要求当我返回一个项目时,我需要将它从数组中移除。因此,我使用了一个保留来确保该项目在返回行之前是有效的(因为当项目被添加到items数组时,发生了唯一的其他已知保留),以及确保稍后清理它的自动释放。我已经检查过这个代码既没有崩溃也没有泄漏。我想知道是否:

a)这是好的 - 我问的原因是,我主要看到代码与alloc/init/autorelease,并没有遇到这种情况与保留/ autorelease b)有一些理由分配/初始化/自动释放,而不是:

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

感谢

+1

这是不好的,因为在这个时代你应该使用ARC,并且不会有这个问题开始。只是说'':) – LearnCocos2D 2013-03-03 20:39:53

+0

同意使用ARC那些日子,但对于学习,我认为这是必不可少的了解这是如何工作的。 – Ultrakorne 2013-03-04 00:37:24

+0

我们打算使用ARC,但是想在修复之前修复现有的泄漏,以便我们了解它是如何工作的。 – Anand 2013-03-04 01:46:36

回答

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

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

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

+0

同意 - 将做ARC(事实上,已经完成了所有测试并尝试过) - 想在修改ARC之前修正泄漏,以便了解... – Anand 2013-03-04 02:39:17