2009-09-02 4 views
1

誰かがこの2つの違いを説明することができます。最初のものは、xcodeが自動的に宣言を生成できるようになっています。最後のものは、Aaron Hillegassの "Cocoa Programming"の例です。リターンオブジェクトポインタの違いは?

- (NSString*)planetName { 
    return [[planetName retain] autorelease]; 
} 

- (NSString*)planetName { 
    return planetName; 
} 

私が起こっていただきました!ただ好奇心、私の理解では、この方法がnilまたは既存の文字列オブジェクトのいずれかへのポインタを返しているということでした。私は保持してから自動解放プールに追加する理由を理解していませんか?

答えて

4

は考えてみましょう:

NSString *planetName = [myPlanet planetName]; 
[myPlanet setPlanetName: @"Bob"]; 
[planetName length]; 

[[planetName retain] autorelease]がなければ、上記の意志が非常に可能性の高いクラッシュ。

retain/autoreleaseは、オブジェクトを現在のスレッドの自動解放プールに入れます。これは、プールが排水されるまでオブジェクトが有効であることを効果的に保証します。通常、現在のイベント(ユーザーイベント、タイマーの起動など)の後に処理が完了します。

(1)@propertyと@synthesizeを使用してください。正しいゲッタ/セッタを生成します。

(2)Cocoa Memory Managementガイドをお読みください。これらの質問すべてに非常によく答えます。ココアに新しいそれらのための神秘的なクラッシュにつながる理由を正確に理解することなく、第2のパターンに続き

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

0

どちらの場合も、どちらもnilまたは文字列オブジェクトへのポインタを返しています。

違いは、最初のコードブロックがメモリ管理を処理し、2番目のコードブロックがメモリ管理を処理する点です。 2番目のコードブロックは、クラスインスタンスのどこか他の場所にあるplanetNameを管理していると仮定していますが、最初のコードブロックでは、Appleはそのメモリを漏らさないようにできるだけ保守的です。現在の自動解放プールにメモリを置くことによって、プールと共に破壊されます。

私のお勧めは、後者の場合を守り、XCodeが自動的に生成するものよりも独自のオブジェクトインスタンスを管理することに少し賢明であることです。

+1

。最初のパターン[防御]を守り、後で最適化するほうが生産性が高いでしょう。 – bbum

+0

[planetName release]を実行したクラスにdeallocメソッドを追加した場合、それは「より賢明なメモリ管理」を構成し、より短い「return planetName;」を安全に使用できるようになりますか?私はすでにそれを持っている、私は混乱しているかもしれないと思う*管理*以上、私は同じように悪いことを知っている。 – fuzzygoat

+0

基本的な考え方は "オブジェクトの所有権"です - あなたは 'planetName'を所有しているオブジェクトを選び、そのオブジェクト内のretain/release呼び出しを追跡したいと思っています。私はbbumのリンクをメモリ管理にお勧めします。少し時間がかかるかもしれませんが、それは良いリソースであり、長い道のりになります。 – fbrereto