我有以下代码:
@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];
由于
答案 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而不再担心这些事情。