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 内でアイテム配列が再度構築されます。私のゲーム ロジックでは、アイテムを返すときに配列から削除する必要があります。そのため、retain を使用してアイテムが戻り行まで有効であることを確認し (アイテムが items 配列に追加されたときに他の唯一の既知の保持が発生したため)、後で確実にクリーンアップされるように autorelease を使用しています。このコードがクラッシュしたりリークしたりしないことを確認しました。かしら:

a) これで問題ありません - 私が質問する理由は、主に alloc/init/autorelease を使用するコードを見たことがあり、retain/autorelease を使用してこのケースに遭遇したことがないからです b) 代わりに alloc/init/autorelease を使用する理由はありますか?

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

ありがとう

4

1 に答える 1

2

これは一般的に問題ありません:

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

これにより意図がより明確になりますが(自動解放されたオブジェクトを返す):

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

割り当て/初期化する理由はありません。それは不必要なオーバーヘッドを追加するだけです。

コメントで言ったように、これが(比較的)新しいプロジェクトである場合は、ARCを使用する必要があり、これらのことについてもう心配する必要はありません.

于 2013-03-03T20:44:56.333 に答える