2011-08-01 11 views
0

私はこのようなメソッドを持っていることを私たちは言ってみましょう:戻り値であるNSDictionary(または他のNSObjects)を解放します。

- (NSDictionary*)getBigDictionaryOfSecrets 
{ 

NSDictionary *theDic = [[NSDictionary alloc] init]; 
theDic = // insert contents of dictionary 

return theDic; 
} 

方法、もう1つはこれを適切に解放する必要がありますか?

+1

'theDic = // insert ... 'がリークすることに注意してください。あなたはすでに辞書を割り当てて、辞書に割り当てました。値を辞書に入れたい場合は、初期化時に( '-initWithObjectsAndKeys:'や他のNSDictionary初期化子を参照)、そうでなければ変更可能な辞書を作成し、作成後に値を追加する必要があります。 – Caleb

答えて

4

お試しreturn [theDic autorelease]これにより、すぐに辞書が解放されず、呼び出し元がretainになります。

1

これはまさにautoreleaseが対象です。

- (NSDictionary*)bigDictionaryOfSecrets 
{ 
    NSDictionary *theDic = [[NSDictionary alloc] initWithObjectsAndKeys:@"bar", @"foo", nil]; 

    return [theDic autorelease]; 
} 

Memory Management Programming Guideautoreleaseについて詳しく読む:このような何かを行います。

+1

補足として、接頭辞「get」は通常、間接的にオブジェクトと値を返すメソッドに使用されます。 – albertamg

0

autoreleaseで戻りオブジェクトを設定すると効果があります。受信者は返されたオブジェクトを保持しなければならないことに注意してください。

- (void)populateBigDictionaryOfSecrets(const NSMutableDictionary*)aDictionary 
{ 
    // insert contents of dictionary 
} 

そして、それが使用されるクラス/メソッドで辞書を解放/作成:提供の答えに、代わりにあなたはこのような何かを行うことができautoreleaseを使用しての代わりに

- (NSDictionary*)getBigDictionaryOfSecrets 
{ 
    NSDictionary *theDic = [[NSDictionary alloc] init]; 
    theDic = // insert contents of dictionary 

    return [theDic autorelease]; 
} 
+0

@Calebが好奇心から逃れた、なぜあなたの代わりにこの答えのサンプルコードを改善しましたか? – albertamg

+0

@albertamg:間違い。私は自分の編集をロールバックし、私がやったことを理解したらそれを自分の答えに移しました。 – Caleb

0

+2

これは、CocoaまたはCocoa Touch開発では一般的ではないことに注意してください。 – Caleb

1

あなたのいずれかがそれを自動解放か、呼び出し側がそれを解放する責任があることを非常によくを文書化します。

+0

呼び出し元が解放するはずのオブジェクトを返さないで、Objective-Cの他のすべてのメソッドに対抗します。プログラムの一貫性を維持することは、プログラムの複雑さにどのように対処するかです。また、人々は、そのメソッドがその名前から何をすべきかを知ることができない限り、通常はドキュメントを読んでいません。 –

+0

私は人々がドキュメントを読んでいないことを知っています。しかし、彼らはどんな場合でも危険にさらされます。この場合、「非常にうまくいく」とは、hファイル、mファイルのメソッドの先頭、および使用されているすべての場所でのドキュメント化を意味します。 –

関連する問題