1

この質問は、Objective-Cの現在の手動メモリ管理と、過去の使用法を理解することを目的としています。

Objective-Cで長年働いてきた人々は、Objective-Cのメモリ管理を「反射」のように扱っていると言われています... (alloc、、、、)retainreleaseautorelease

しかし、Objective-Cがコンピューターで使用されている場合、ガベージコレクションがあるというのは本当ではありませんか?iOSにはガベージコレクションがないため、Objective-Cでの手動管理は、iPhoneとiPadで最近使用されるまで必要ないというのは本当ではありませんか?過去、おそらく、Objective-Cにガベージコレクションがない90年代に、または常にガベージコレクションがありますが、iPhoneが発売されてから、retainreleaseが言語に追加されたのはどうですか?

4

3 に答える 3

4

あなたが実際に尋ねた質問に答えるために、Objective-Cは2007年のMac OS X 10.5 Leopardのリリースでのみガベージコレクションを取得しました。それ以前は、手動のメモリ管理が唯一のオプションでした。Leopardのリリース後も、ほとんどのCocoa開発者は、既存のコードベースの慣性、古いOSバージョンのサポートの必要性、ガベージコレクションの使用に固有のパフォーマンスペナルティ、iOSでサポートされていないなど、さまざまな理由でガベージコレクションを使用しませんでした。

ARCはいくつかの理由でより早く採用されており、私(そして明らかにApple)は、ガベージコレクションよりもはるかに優れたソリューションだと思います。ARCは、iOS5.0およびMacOS X 10.7 Lionのリリースで利用可能になりました(iOS4.3およびMacOS X 10.6への展開が部分的にサポートされています)。LionとiOS5はどちらも1年以内にリリースされたので、Objective-Cをそれより長く書いている開発者は、手動の参照カウントを使用/使用していました。

ARCは、少なくともガベージコレクションと比較して、急速に採用されていますが、その使用はまだ普遍的ではありません。iOS4.2以前またはMacOSX 10.5以前をサポートする必要がある人は、手動の参照カウントを絶対に使用する必要があります。また、ARCに切り替える理由をまだ見たことがない、経験豊富なCocoaプログラマーもたくさんいると思います。なぜなら、彼らにとって、手動の参照カウントは大きな負担ではないからです。

于 2012-05-19T18:13:45.587 に答える
4

しかし、Objective-Cがコンピューターで使用されている場合、ガベージコレクションがあるというのは本当ではありませんか?

ガベージコレクションは、まず、ObjCに関する限り、2007年にOS X 10.5と同時に導入された新しい機能です。次に、フレームワーク機能です。つまり、Cocoaの一部です。言語自体の一部。それはまだOSXで利用可能ですが、私が知る限り、Appleはそれをもう使用するつもりはありません。ARCは、システムが提供する新しいメモリ管理パラダイムです。

iOSにはガベージコレクションがないため、Objective-Cでの手動管理は、iPhoneとiPadで最近使用されるまで必要ないというのは本当ではありませんか?過去、おそらく90年代に、Objective-Cにガベージコレクションがない場合、または常にガベージコレクションがある場合はどうでしょうか。ただし、iPhoneが発売されてから、

いいえ、NeXTの時代から、Cocoaのガベージコレクションが導入されるまで、デスクトップでは常に手動のメモリ管理が必要でした(C ++またはCの場合と同様)。GCを利用できるようにした後でも、パフォーマンスの懸念や古いOSバージョンで実行する必要があるため、多くの人がMRRを使い続けることを好みました。

次に、retainreleaseが言語に追加されましたか?

特定のメソッドretainrelease、およびそれらが有効にする参照カウントシステムも、言語ではなくフレームワークの一部ですが、CocoaはObjC(GNUStepなどの他のObjCフレームワークはCocoaを模倣)を使用する卓越したフレームワークであるため、これは、ObjCを作成するときにメモリ管理が実行される主な方法です。(もちろん、CocoaはNeXTからretain/システムを継承しました。)release

独自のメモリ管理メソッド/システムを使用して別のルートクラスを作成することは完全に可能です。ただし、そうしてCocoaと対話しようとすると、少しおかしくなり、ARCでコンパイルすることはできません。

于 2012-05-19T18:16:07.887 に答える
1

手動メモリ管理(またはコンパイラに手動メモリ管理の一部を実行するように指示するARC)を使用すると、実行時のパフォーマンスをより確実に決定し、アプリのピークメモリ使用量をより適切に制御できます。どちらも小型のモバイルデバイスで非常に重要です。ガベージコレクションを行うと、ユーザーのバッテリー寿命が無駄になるのはなぜですか。アニメーションとUIの応答性が良くなるために、最悪の場合がよくあります。

于 2012-05-20T02:30:17.947 に答える