2009-04-29 12 views
-1

実際、私は言う:はい、ゲッターは所有者です。 Getterを呼び出す人は誰でもメモリを解放する責任はありません。より正確に言えば、オブジェクト自体は所有者ですが、Getterは他のインスタンスへのインスタンス変数の配信メカニズムとして機能します。それが正しいのですか、それとも間違っていましたか?Getterがインスタンス変数の所有者であると言うのは有効でしょうか?または誰がそれを所有していますか?

+0

所有権とは、不要になったときに所有権を解放することを意味します。これは通常、クラスのdealloc()で行われ、getterでは行われません。 所有権の定義が異なると思います。明確にすることはできますか? – thesamet

+0

このような質問をするときには、あなたがココアについて質問している質問の文章ではっきりさせるべきです。あるいは、参照されていない言語についての誤解を招くような回答(ここに挙げたもののようなもの)がたくさんあります。 – smorgan

答えて

0

本質的に正しいですが、それは単なる慣習の問題です。コンベンションが一貫して適用され、プロジェクトに取り組んでいるすべての人がそれに同意する限り、あなたは金色です。

問題が発生するのは、呼び出し元がアクセッサから取得したメモリにポインタをキャッシュし、オブジェクトが破棄されてポインタがぶら下がっている場合です。

+1

これは一般的に妥当な答えですが、参照カウントを使用するObjective-Cオブジェクトには適用されません。 –

+0

@Jens Alfke、小規模な修正、FoundationオブジェクトはすべてのObjective-Cオブジェクトではなく、参照カウントを使用します。基本ランタイムによって実装されたObjective-Cオブジェクトは、ソートの何も提供しません。それは唯一のivar is isaです。 – dreamlax

0

です。

オブジェクト所有権ポリシーを決定する必要があります。しかし、一般に、オブジェクトが別のオブジェクトのサブオブジェクト(メンバ)であれば、そのオブジェクトはその存続期間を担当し、(一般的に)そのデストラクタをクリーンアップします。

呼び出し元がクリーンアップするメモリを渡すのは一般的には面倒です。 Cでは、呼び出し元にメモリを割り当てる必要のあるライブラリ(X WindowsライブラリやデータベースクライアントのC API)は、別のライブラリ関数を呼び出すことによって呼び出し側が破棄する必要がある不透明なポインタを渡します。

Window foo = APIcreateWindow(); 
APIsetupWindow(foo, x, y, z); 
AOIshowWindow(foo); 
APIdestroyWindow(foo); //forgetting to call this leaks memory 

その(仮想)コードでは、Windowは実際にはstructへのポインタのtypedefです。 APICreateWindowは構造体のメモリを割り当て、APIdestroyWindowは他のAPIブックキーピングを行った後、その上で空きを呼び出します。

C++では、何も参照していないときにスマートポインタを破棄する可能性があります。

+0

ココアは全く異なっています。現代のObjective-Cランタイムはガベージコレクションを持っていますが、古いランタイムまたはあまり洗練されていないランタイムは一般的に参照カウントを使用します。メソッドから保持されたオブジェクトを返すことは、呼び出し側がそれ自身を保持できるため、通常は不要です。通常、保持されているオブジェクトを返す唯一のメソッドは、それらを割り当てるメソッドです。スペースを割り当てるメソッドの場合は、autoreleaseプールにオブジェクトを追加するために使用できる-autoreleaseメソッドがあります。オブジェクトの存続期間は、呼び出し元のメソッドの存続期間にわたって保証されますが、必要に応じて手動で保持することができます。 – dreamlax

1

参照カウントシステムを使用するCocoaについて質問しているので、 "the"所有者はありません。保持参照を持つすべての人は、その参照を解放する責任を負う部分的な所有者です。最後の参照が解放されると、オブジェクトの割り当てが解除されます。

慣例では、ゲッターは呼び出し側に保持参照を与えないが、呼び出し側がオブジェクトを明示的に保持することを選択できなかったことを意味するものではない。

5

オブジェクトについては、メソッド、所有オブジェクトではなく、話すのが理にかなっています。戻り値がインスタンス変数であるため

はかなり頻繁に、ゲッターは上に呼び出されていることの目的は、返されるオブジェクトの所有者である:

  • (フー*)FOO { 戻り_foo。ゲッターは自動解放されています一時オブジェクトを作成し、それを返すようにするために }

変数//私の場合は、しかし、それはまた、一般的です:

  • (NSStringの*)sizeStr { リターン[NSStringのstringWithFormat:@ "%d"、self。サイズ];この場合 }

、そのオブジェクト(NSStringの)は、実際にそれが終了したときにそれを解放する、おそらく現在の自動解放プールを除き、所有者を有していません。

(非GC)Cocoaプログラミングで重要なルールは、所有権そのものとは関係ありませんが、オブジェクトへの参照がある時点で(ある時点で解放する必要がある)あなたがしないときに。

関連する問題