2009-09-03 12 views
5

this questionへのいくつかの答えに基づいて、+ allocはObjective-Cのオブジェクトのインスタンスにメモリを割り当てるためのいくつかの裏返しの魔法をしているようです。 + allocをオーバーライドする必要はありますか?Objective-Cで+ allocをオーバーライドする必要がありますか?

+0

ケンは言いました。しかし...強調するために、そうすることは非常にまれです。 – bbum

答えて

7

非常にまれです。

NSStringは実装の詳細として+ allocをオーバーライドするクラスの例です。確認するなら、+ [NSString alloc]は何かNSPlaceholderStringクラスを返します。これは文字列class clusterの実装の一部です。

デフォルトでは、別の割り当てNSZoneから割り当てるように上書きすることもできます。または、NSAllocateObjectと電話をかけてextraBytesにゼロ以外の何かをつけて、あなたのイーグルスに続くスペースを動的に与えるようなトリックを演奏することもできます。

@interface { 
    NSUInteger length; 
    unichar *data; 
} 

が、それはそうではありません:たとえば、あなたが正常に終わることのNSStringのプライベートサブクラスはこのようになりますことを考えるかもしれません。それは、長さと文字の両方のデータを含む単一のメモリブロックです。異なるNSStringインスタンスは異なるサイズのメモリブロックです。これはNSAllocateObjectを直接呼び出すことで手配できるものです。

しかし、これらのことのすべては秘訣です。 + allocをオーバーライドすると、何か特別なことが起こります。

4

+allocは、Objective-Cランタイムのメソッドを呼び出してクラスインスタンスのサイズを取得し、その量のメモリを割り当てるだけです。真のシングルトンを書くときには+allocを無効にすることができます(つまり、クラスのインスタンスを1つしか割り当てられないことを保証したい場合)。シングルトンクラスを書くときにこれらの長さに行く必要はほとんどありませんが、そうすることができます。一般的には、+allocをオーバーライドして(別のゾーンにメモリを割り当てずに、受信クラスと異なるクラスを割り当てるなど)、代わりに+[super alloc]と呼んで標準の作業を行います独自のカスタマイズ。

1

私は:例えば、シングルトンクラスのアロケーションを上書き

#import "Singleton.h" 

static Singleton * instance; 

@implementation Singleton 

+ (void)initialize 
{ 
    if (!instance) { 
     instance = [[super allocWithZone:NULL] init]; 
    } 
} 

+ (id)allocWithZone:(NSZone * const)notUsed 
{ 
    return instance; 
} 

@end 
+0

'[Singleton new]'を書いたユーザに、新しいインスタンスを取得しないと誤って伝えるので、これは通常、適切な方法ではありません。実際、インスタンスは 'init'-edを1回ではなく2回取得しました。その代わりに '+(instancetype)sharedInstance;'クラスメソッドを公開するだけです。 'allocWithZone:'を保護しても、ランタイム関数を使って複数のインスタンスをインスタンス化するユーザから保護されるわけではありません。 –

関連する問題