2011-12-22 10 views
0

私はアップルのAdvanced Memory Management Programming Guideを見ています。次のコードについてはObjective-C:基本的なメモリ管理。オブジェクトの所有権?

:あなたが安全にメソッドから文字列を返すことができるように、基本的なルールに従う

-(NSString *)fullName { 
    NSString *string = [NSString stringWithFormat:@"%@ %@", 
                self.firstName, 
                self.lastName]; 
    return string; 
} 

は、あなたが:, stringWithFormatによって返される文字列を所有していません。

...したがって、リリースする必要はありません。あなたが名前を「ALLOC」、「新」、「コピー」、または「mutableCopy」

で始まるメソッドを使用してオブジェクトを作成する

ガイドの他の部分からの基本的なルールに

...これはあなたをオーナーにします)

だから、誰がその文字列を所有していますか?

答えて

2

この時点で、自動解放プールは文字列を所有しています。元々Foundationフレームワークによって作成されたもので、オブジェクトを割り当てて所有者になりました。 Foundationは、オブジェクトをコードに返す前に、autoreleaseを呼び出して所有権を自動解放プールに切り替えました。

0

stringWithFormat:を使用すると、呼び出し元にオブジェクトの所有権がありません。したがって、autoreleaseを呼び出さずにオブジェクトを返すことができます。 initWithFormat:を使用していた場合、返す前にオブジェクトを自動解放する必要があります。

0

「所有」は貧弱な用語ですが、状況によっては適切ですが一般的ではありません。実際の質問は次のとおりです。

1)オブジェクトにアクセスする必要がなくなるまで、オブジェクトはretainになりますか?

2)不要になったときにreleaseを送信する責任はありますか?

上記の例では、オブジェクトはretainであり、アプリケーションが「空になる」ときにautoreleasedになります。したがって、あなたはそれを解放する責任を負いません。それは、あなたのメソッドの呼び出しの期間中(そしてそれ以上)、それ以上の努力なしにはretainになります。

+0

+1「所有権」の概念全体が合わないことに同意しますが、アップルがいつかドキュメントにそれを追加するのは避けるのが難しいです。 – Caleb

0

作成したオブジェクト(alloc/copyを使用)を所有しているか、保持しています。
親指の規則として、ファクトリメソッドによって返されるオブジェクトは、自動解放されたオブジェクトである可能性が高く、解放する必要はありません。
これは、stringWithFormatメソッドから取得したNSStringを解放しない理由を説明しています。
変更すると、最初のケースでは返されたオブジェクトが独自の文字列になります。 alloc /で

string = [[NSString stringWithFormat:@"%@ %@",self.firstName,self.lastName] retain]; 

は、明示的に解放する必要のあるオブジェクトを作成してコピーする - これがあなたの第二のケースを説明しています。

関連する問題