0

私はObjective-cの初心者です。次のコードのようなオブジェクトを返すときに、次のように自動リリースする必要があるかどうかを知りたいです。

- (NSArray *)loadCategory
{
    NSArray *temp = [[[NSArray alloc] initWithObjects:c1, c2, nil] autorelease];

    return temp;
}

さらに、呼び出し関数を使用して戻り値を取得する場合、目的を保持する必要があるかどうか。

- (void)viewDidLoad
{
     category = [self loadCategory];

     [category retain];

   [super viewDidLoad];
}

最後に、次のように置き換えることができますか?

- (void)viewDidLoad
    {
        self.category = [self loadCategory];
       [super viewDidLoad];
    } 
4

3 に答える 3

0

プロパティがまたはcategoryとして定義されている限り、3つの例はすべて正しく見えます。またはでリリース(またはに設定)することを忘れないでください。retaincopynilviewDidUnloaddealloc

于 2012-05-08T09:14:42.740 に答える
0

はい、その通りです。loadCategoryメソッドでautoreleaseを呼び出す必要があります。これにより、自動解放プールが配列オブジェクトの解放を処理できるようになります(呼び出し元のコードがそれを保持するように変更されるまで解放されません)。はい、呼び出し元のコードから配列を保持する必要があります。そして最後に、はい、self.categoryプロパティが'retain'で宣言されている限り:

@property (nonatomic,retain) NSArray *category;

また、プロパティは配列を保持しているため、後で、たとえばdeallocで解放する必要があります。

于 2012-05-08T09:15:31.373 に答える
0

あなたのコードは大丈夫です。または、...を使用することもできます。

[NSArray arrayWithObjects:...、nil];

これにより、自動解放インスタンスが返されます。

また、不要になった後も保持している場合は、この配列でreleaseを呼び出すことを忘れないでください。

于 2012-05-08T09:16:00.403 に答える