1

私はウェブを検索し、多くの投稿を読んでいますが、これがどのように機能するかをまだ説明していません. どのメソッドも自動解放されたオブジェクト (alloc、new、copy、および mutableCopy を除く) を返さなければならないという規約があることを知っているので、次のようなもので問題ありません。

-(MyClass*)findRandomName { return [[[MyClass alloc] initWithString:@"Something"] autorelease]; }

私の質問は、便利なメソッドまたは同様のものを使用する場合、戻り値で autorelease も呼び出す必要がありますか? ここみたいに:

-(MyClass*)findRandomName { return [[MyClass startFromString:@"Something"] autorelease]; }

そして、なぜ、またはなぜではないのですか?ありがとうございます。

4

1 に答える 1

2

[MyClass alloc]を呼び出す前に呼び出す必要があるため、最初の例は正しくありませんinitWithString

-(MyClass*)findRandomName { 
    return [[[MyClass alloc] initWithString:@"Something"] autorelease]; 
}

2 番目の例では、オブジェクトを使用しないでください。 メソッドはすでにオブジェクトである必要がありautorelease、再度行うと、オブジェクトを過剰に解放します。startFromStringautoreleaseautorelease

2 番目の例では、findRandomNameメソッドはオブジェクトの所有権を取得しないため (メソッドが呼び出すメソッドの名前にallocnewcopyまたはが含まれていないため)、オブジェクトを所有するべきではありません。mutableCopyrelease

「規則では、メソッドは自動解放されたオブジェクトを返さなければならないと言われています(init、new、copyを除く)」というあなたの声明は、まったく正しくありません。メモリ管理ポリシーは次のように述べています。

あなたが作成したオブジェクトはあなたが所有します

名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッド (たとえば、alloc、newObject、または mutableCopy) を使用してオブジェクトを作成します。

于 2012-10-29T00:02:38.830 に答える