フォーラムの議論から、大きな違いはパフォーマンス要因のように見えます。 allocWithZone: は特定のメモリ領域からメモリを割り当て、スワッピングのコストを削減します。
実際には、 allocWithZone: を使用する機会はほとんどありませんが、 allocWithZone: を使用するケースを説明する簡単な例を誰でも示すことができます。
ありがとう、
フォーラムの議論から、大きな違いはパフォーマンス要因のように見えます。 allocWithZone: は特定のメモリ領域からメモリを割り当て、スワッピングのコストを削減します。
実際には、 allocWithZone: を使用する機会はほとんどありませんが、 allocWithZone: を使用するケースを説明する簡単な例を誰でも示すことができます。
ありがとう、
あるオブジェクトが別のオブジェクトを作成する場合、両方が同じメモリ領域から割り当てられていることを確認することをお勧めします。zone メソッド (NSObject プロトコルで宣言されている) をこの目的に使用できます。受信者が配置されているゾーンを返します。
これは、ivar と、クラス自体が「作成」するすべてのオブジェクト+allocWithZone:
をこの方法で利用して、同じゾーンで作成するインスタンスを作成できることを示唆しています。
-(id)init {
if (self = [super init]) {
someIvar = [[SomeOtherClass allocWithZone:[self zone]] init];
}
return self;
}
allocWithZone: を使用する良い例は、NSCopy プロトコルを実装する場合です。これにより、次のようにカスタム オブジェクトをコピー可能 (ディープ コピー / 値によるコピー) にすることができます。
(1) ClassName *newObject = [currentObject copy]; //results in newObject being a copy of currentObject not just a reference to it
NSCopy プロトコルにより、メソッドの実装が保証されます。
(2) -(id)copyWithZone:(NSZone *)zone;
オブジェクトをコピーするとき、上記 (1) のように送信する 'copy' メッセージは、'copyWithZone として指定されている場合、メソッド (2) にメッセージを送信します。つまり、自分でゾーンを取得するために何もする必要はありません。
このメッセージに「ゾーン」が送信されたので、それを使用して、オリジナルと同じリージョンのメモリからコピーが作成されるようにすることができます。
これは次のように使用できます。
-(id)copyWithZone:(NSZone *)zone
{
newCopy = [[[self class]allocWithZone:zone]init]; //gets the class of this object then allocates a new object close to this one and initialises it before returning
return(newCopy);
}
これは、allocWithZone が実際に使用されていることを私が認識している唯一の場所です。
Foundation Functions Referenceでは、すべての関数のZone
前に、ゾーンが無視されるという以下の警告が付けられています。
ゾーンは、iOS では無視され、OS X では 64 ビット ランタイムです。現在の開発ではゾーンを使用しないでください。
NSCreateZone
NSRecycleZone
NSSetZoneName
NSZoneCalloc
NSZoneFree
NSZoneFromPointer
NSZoneMalloc
NSZoneName
NSZoneRealloc
NSDefaultMallocZone
私allocWithZone
はシングルトンで使用します。フォレストが述べたように、作成された変数はメモリの同じ領域から割り当てられました。したがって、他のクラスは、メモリの同じゾーンからそれらを使用またはアクセスできます。アプリの実行時にメモリ スペースを節約します。