2011-05-02 1 views
3

関数の内部にオブジェクトを作成して返している場合、このオブジェクトをどこから解放する必要がありますか?ここでは、オブジェクトを作成する例を示します。リリースオブジェクトが正しい方法で返されますか?

- (NSDictionary*) sampleFunction 
{ 
    NSMutableDictionary* state = [[NSMutableDictionary alloc] initWithCapacity:5]; 

    [state setObject:[[NSNumber alloc] initWithInt:self.a] forKey:@"a"]; 
    [state setObject:[[NSNumber alloc] initWithInt:self.b] forKey:@"b"]; 
    [state setObject:[[NSNumber alloc] initWithInt:self.c] forKey:@"c"]; 

    return state; 
} 

その他の質問:メモリリークを避けるために、ここで割り当てられたNSNumbersもリリースする予定ですか?このコードはメモリリークなしでどのように見えますか?

答えて

1

まず、あなたはすべてのルールについては、このガイドに行く必要があります。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

...人々が福音としてここに言うことを取ることはありません。上にリンクされたガイドにはいくつかの例外と奇妙なルールがあります。

あなたの例に関連して:広く話すときはいつでも、alloc何かをリリースする必要があります。メソッドから値を返すときは、autoreleased(99%の時間)でなければなりません。いくつかの例外があります。アップルは便利な自動解放メソッドをいくつか提供しています - NSNumberにはこれらのいずれかがあります。

私は上記のあなたのコードを表示しようとしますが、これらの自動解放のメソッドを使用するようにリライトしています:

- (NSDictionary*) sampleFunction 
{ 
    NSMutableDictionary* state = [NSMutableDictionary dictionaryWithCapacity:5]; 

    [state setObject:[NSNumber numberWithInt:self.a] forKey:@"a"]; 
    [state setObject:[NSNumber numberWithInt:self.b] forKey:@"b"]; 
    [state setObject:[NSNumber numberWithInt:self.c] forKey:@"c"]; 

    return state; 
} 

私が述べたように、あなたもalloc/initautoreleaseを使用することができます。

NSMutableDictionary* state = [[[NSMutableDictionary alloc] initWithCapacity:5]autorelease]; 

アゲイン私が上にリンクしたアップルの文書は、メモリ管理に関する質問への回答のためにはとなるでしょう。です。

+0

非常に参考になりました。ありがとうございます。 – Mark