2011-10-28 6 views
15

それは簡単な質問かもしれないが、私のクラスでNSCopyingプロトコルを実装し、なぜ、私はこれはオブジェクトとコピー配列のために、このメソッドを使用して呼び出されたゼロNSCopyingを実装しているときにゾーンが常にnilであるのはなぜですか?

- (id)copyWithZone:(NSZone *)zone 
{ 
    if (zone == nil) 
     NSLog(@"why this is allways nil"); 

    (...) 
} 

ゾーン==を取得します。

[[NSArray alloc] initWithArray:myArray copyItems:YES]]; 

答えて

25

ケビンさんとロビンの答えが最も正確である参照してください。オスカーの答えは正しいものです。しかし、Gnustepのドキュメントもlogancautrellのゾーンの存在理由も、まったく正しいものではありません。最初NXZone、NSZone - -

ゾーン最初に作成された多くが真であることを、単一ゾーンから割り当てられたオブジェクトは、メモリ内に比較的連続であろうことを保証します。判明したように、これはアプリケーションが使用するメモリの量を減らしません。それはほとんどの場合、わずかに増加することになります。

大きな目的は、大量のオブジェクトのセットを破壊することができることでした。例えば

ドキュメントを閉じたときに、ドキュメントベースのアプリケーション、オブジェクトグラフのティアダウンに複雑な文書をロードした場合、実際には非常に大きく、高価である可能性があります。ドキュメントのすべてのオブジェクトが単一のゾーンから割り当てられた場合

従って、そのゾーンの割り当てメタデータがそのゾーンにもした後、文書に関連するすべてのオブジェクトの破壊のように安価であろう単にゾーン破壊(本当に安かった - 「ここで、システム、バックこれらのページを持っている」 - 1つの関数呼び出し)。

これは実行不可能であることが判明しました。ゾーン内のオブジェクトへの単一の参照がゾーン外に漏れた場合、アプリケーションはドキュメントが閉じられるとすぐにBOOMになり、オブジェクトがそれを参照していたことを止める方法はありません。第二に、このモデルは、GCシステムで頻繁に遭遇する「希少資源」の問題に遭遇しました。すなわち、文書のオブジェクトグラフが非メモリリソース上に保持されている場合、ゾーン破壊の前に前記リソースを効率的にクリーンアップする方法がなかった。

結局のところ、パフォーマンスの勝利ではない(複雑なドキュメントをどれくらいの頻度で閉じているか)と、脆弱性が増したことの組み合わせは、ゾーンを悪い考えにしました。 APIを変更するには遅すぎますが、私たちは残っています。

+0

恐ろしく、私はあなたがこれに答えることを望んでいた。サイドノートは、これはAppleのドキュメントにいつでも書かれていましたか?今日私が見つけることができるのは、NSZone *の基礎的な方法です。 – logancautrell

+3

あなたが私の注意を引いてくれるような疑問があれば、Twitterで私を尋ねてください。言語(そしてOS)の進化は、本当に魅力的です。これまでに文書化されていた場合、おそらくラプソディの時代に残ったものだったでしょう。私はゾーンが適切なMac OS Xのリリースで推奨されたとは思わない。 – bbum

+1

あなたの投稿は、あなたのユニークな地位と歴史のために高く評価されています。 Appleのエンジニアがもっと多くの時間を費やして欲しいです! – logancautrell

1

ゾーンは、コンピュータのRAMが8メガ以下であった昔の遺産です。

チェックこのアウト(3.1.2メモリの割り当てとゾーン):

http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_3.html

ココアビルダーでこのオーバーの良い議論もあり(まあ、それはココアdevメーリングリスト上であった)から約10年前。これはまさに@bbumが言っていたことです。

http://www.cocoabuilder.com/archive/cocoa/65056-what-an-nszone.html

どうやらこれは、Appleのドキュメントに記載されるように使用されていますが、2007年6月6日以来、いくつかの点で変更されました。それはかなり古いですので

http://www.cocoadev.com/index.pl?NSZone

1

NSZoneは、その目的は、仮想メモリページの同じセットを使用して、ヒープ上のオブジェクトを割り当てることだった、今で文書化されていないクラスです。しかし、これはほとんど使用されていませんが、以前は使用されていたので、そのパラメータは下位互換性のために残っています。

3

NSZoneは、以前は廃止されました。メソッドシグネチャ(例:+allocWithZone:および-copyWithZone:)にまだ残っていることは、下位互換性のためです。

+1

copyWithZoneが推奨されない場合(NSCopyingプロトコル定義には記載されていないもの)、必要なcopyWithZoneでNSCopyingを実装する方法:最近は? – Marcin

+3

'-copyWithZone:'は推奨されていません。 'NSZone'はです。ゾーン引数を無視してください。 –

4

NULLゾーンは「デフォルトゾーンを使用する」という意味です。ゾーンは現代のObjective Cランタイムでは使用されず、ARCではまったく使用できません。

documentation

関連する問題