15

単純な質問かもしれませんが、なぜ私のクラスに NSCopying プロトコルを実装するのですか? zone == nilとなります。

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

    (...)
}

これは、オブジェクトを含むコピー配列に対してこのメ​​ソッドを使用して呼び出されます。

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

5 に答える 5

4

NULL ゾーンは、単に「デフォルト ゾーンを使用する」ことを意味します。ゾーンは最新の Objective C ランタイムでは使用されなくなり、ARC ではまったく使用できなくなりました。

ドキュメントを見る

于 2011-10-28T19:57:50.940 に答える
3

NSZoneずっと前に廃止されました。それがまだメソッド シグネチャ (+allocWithZone:および など-copyWithZone:) にあるという事実は、後方互換性のためです。

于 2011-10-28T19:56:47.027 に答える
1

Zone は、コンピュータの RAM が 8 MB 以下だった昔からの遺産です。

これをチェックしてください(3.1.2メモリ割り当てとゾーン):

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

これについては、約 10 年前から cocoa builder (cocoa dev メーリング リストにありました) に関する良い議論もあります。これはまさに@bbumが言っていたことです。

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

どうやらこれは Apple ドキュメントに記載されていたようですが、2007-06-06 以降のある時点で変更されました。

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

于 2011-10-28T19:56:18.943 に答える
1

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

于 2011-10-28T19:56:26.680 に答える