実際、私は言う:はい、ゲッターは所有者です。 Getterを呼び出す人は誰でもメモリを解放する責任はありません。より正確に言えば、オブジェクト自体は所有者ですが、Getterは他のインスタンスへのインスタンス変数の配信メカニズムとして機能します。それが正しいのですか、それとも間違っていましたか?Getterがインスタンス変数の所有者であると言うのは有効でしょうか?または誰がそれを所有していますか?
答えて
本質的に正しいですが、それは単なる慣習の問題です。コンベンションが一貫して適用され、プロジェクトに取り組んでいるすべての人がそれに同意する限り、あなたは金色です。
問題が発生するのは、呼び出し元がアクセッサから取得したメモリにポインタをキャッシュし、オブジェクトが破棄されてポインタがぶら下がっている場合です。
これは一般的に妥当な答えですが、参照カウントを使用するObjective-Cオブジェクトには適用されません。 –
@Jens Alfke、小規模な修正、FoundationオブジェクトはすべてのObjective-Cオブジェクトではなく、参照カウントを使用します。基本ランタイムによって実装されたObjective-Cオブジェクトは、ソートの何も提供しません。それは唯一のivar is isaです。 – dreamlax
です。
オブジェクト所有権ポリシーを決定する必要があります。しかし、一般に、オブジェクトが別のオブジェクトのサブオブジェクト(メンバ)であれば、そのオブジェクトはその存続期間を担当し、(一般的に)そのデストラクタをクリーンアップします。
呼び出し元がクリーンアップするメモリを渡すのは一般的には面倒です。 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++では、何も参照していないときにスマートポインタを破棄する可能性があります。
ココアは全く異なっています。現代のObjective-Cランタイムはガベージコレクションを持っていますが、古いランタイムまたはあまり洗練されていないランタイムは一般的に参照カウントを使用します。メソッドから保持されたオブジェクトを返すことは、呼び出し側がそれ自身を保持できるため、通常は不要です。通常、保持されているオブジェクトを返す唯一のメソッドは、それらを割り当てるメソッドです。スペースを割り当てるメソッドの場合は、autoreleaseプールにオブジェクトを追加するために使用できる-autoreleaseメソッドがあります。オブジェクトの存続期間は、呼び出し元のメソッドの存続期間にわたって保証されますが、必要に応じて手動で保持することができます。 – dreamlax
参照カウントシステムを使用するCocoaについて質問しているので、 "the"所有者はありません。保持参照を持つすべての人は、その参照を解放する責任を負う部分的な所有者です。最後の参照が解放されると、オブジェクトの割り当てが解除されます。
慣例では、ゲッターは呼び出し側に保持参照を与えないが、呼び出し側がオブジェクトを明示的に保持することを選択できなかったことを意味するものではない。
オブジェクトについては、メソッド、所有オブジェクトではなく、話すのが理にかなっています。戻り値がインスタンス変数であるため
はかなり頻繁に、ゲッターは上に呼び出されていることの目的は、返されるオブジェクトの所有者である:
- (フー*)FOO { 戻り_foo。ゲッターは自動解放されています一時オブジェクトを作成し、それを返すようにするために }
変数//私の場合は、しかし、それはまた、一般的です:
- (NSStringの*)sizeStr { リターン[NSStringのstringWithFormat:@ "%d"、self。サイズ];この場合 }
、そのオブジェクト(NSStringの)は、実際にそれが終了したときにそれを解放する、おそらく現在の自動解放プールを除き、所有者を有していません。
(非GC)Cocoaプログラミングで重要なルールは、所有権そのものとは関係ありませんが、オブジェクトへの参照がある時点で(ある時点で解放する必要がある)あなたがしないときに。
- 1. IErrorInfoの所有者は誰ですか?
- 2. マイクロソフトの紺碧の所有者が所有者ではありません
- 3. JDialogとその所有者
- 4. 誰がシーケンス図のメソッドを所有していますか?
- 5. Plesk CronジョブとFTP - ファイルアクセスの所有者は誰ですか?
- 6. Getメソッドのインスタンス所有者
- 7. 誰がNSWindowControllerを所有していますか?
- 8. 一部のドメインの「登録所有者」は誰ですか?
- 9. AfxBeginThreadでCWinThreadを作成した後、誰が所有していますか?
- 10. ファイル所有者がLinuxで所有権を変更できない
- 11. HOWTO:owneeでレンダリング所有者が
- 12. CおよびC++の所有者は誰ですか?
- 13. 返されたBSTRを所有しているのは誰ですか?
- 14. 錆リスト要素(リスト所有者と複数の参照者)の複数の所有者 - 可能ですか?
- 15. エラー:データベースの所有者である必要があります
- 16. 「DynamicMethodのタイプ所有者が無効です」というエラーが発生しました。
- 17. TFSビルドワークスペースの所有者がビルドサービスアカウントではありません
- 18. QToolBoxはそのアイテムを所有していますか?
- 19. が所有者クラス(JFrameの)
- 20. Javaのint.classには何が入っていますか?それはなぜ有効なのでしょうか?
- 21. ユニーク制約「所有者が所有する属性」を介して結合テーブル
- 22. 変数の所有者を返す - スウィフト
- 23. gulp chownは所有者を変更していません
- 24. この特性所有者はユニットテストに有益ですか?
- 25. 特定の所有者を持つ(または所有していない)ファイルを見つける
- 26. 所有者描かれたタスクバーのサムネイルプレビュー
- 27. Postgresql 9.5のインストール - 設定所有者(postgres:105)とデータ所有者(ubuntu:1000)が一致せず、設定所有者がrootではない
- 28. C#でIDisposableオブジェクトの共有所有者
- 29. autofacと所有インスタンス
- 30. IBM Bluemix所有者のアカウントで所有権を別のユーザーに移管する必要があります
所有権とは、不要になったときに所有権を解放することを意味します。これは通常、クラスのdealloc()で行われ、getterでは行われません。 所有権の定義が異なると思います。明確にすることはできますか? – thesamet
このような質問をするときには、あなたがココアについて質問している質問の文章ではっきりさせるべきです。あるいは、参照されていない言語についての誤解を招くような回答(ここに挙げたもののようなもの)がたくさんあります。 – smorgan