this questionへのいくつかの答えに基づいて、+ allocはObjective-Cのオブジェクトのインスタンスにメモリを割り当てるためのいくつかの裏返しの魔法をしているようです。 + allocをオーバーライドする必要はありますか?Objective-Cで+ allocをオーバーライドする必要がありますか?
答えて
非常にまれです。
NSStringは実装の詳細として+ allocをオーバーライドするクラスの例です。確認するなら、+ [NSString alloc]は何かNSPlaceholderStringクラスを返します。これは文字列class clusterの実装の一部です。
デフォルトでは、別の割り当てNSZoneから割り当てるように上書きすることもできます。または、NSAllocateObjectと電話をかけてextraBytes
にゼロ以外の何かをつけて、あなたのイーグルスに続くスペースを動的に与えるようなトリックを演奏することもできます。
@interface {
NSUInteger length;
unichar *data;
}
が、それはそうではありません:たとえば、あなたが正常に終わることのNSStringのプライベートサブクラスはこのようになりますことを考えるかもしれません。それは、長さと文字の両方のデータを含む単一のメモリブロックです。異なるNSStringインスタンスは異なるサイズのメモリブロックです。これはNSAllocateObjectを直接呼び出すことで手配できるものです。
しかし、これらのことのすべては秘訣です。 + allocをオーバーライドすると、何か特別なことが起こります。
+alloc
は、Objective-Cランタイムのメソッドを呼び出してクラスインスタンスのサイズを取得し、その量のメモリを割り当てるだけです。真のシングルトンを書くときには+alloc
を無効にすることができます(つまり、クラスのインスタンスを1つしか割り当てられないことを保証したい場合)。シングルトンクラスを書くときにこれらの長さに行く必要はほとんどありませんが、そうすることができます。一般的には、+alloc
をオーバーライドして(別のゾーンにメモリを割り当てずに、受信クラスと異なるクラスを割り当てるなど)、代わりに+[super alloc]
と呼んで標準の作業を行います独自のカスタマイズ。
私は:例えば、シングルトンクラスのアロケーションを上書き
#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
'[Singleton new]'を書いたユーザに、新しいインスタンスを取得しないと誤って伝えるので、これは通常、適切な方法ではありません。実際、インスタンスは 'init'-edを1回ではなく2回取得しました。その代わりに '+(instancetype)sharedInstance;'クラスメソッドを公開するだけです。 'allocWithZone:'を保護しても、ランタイム関数を使って複数のインスタンスをインスタンス化するユーザから保護されるわけではありません。 –
- 1. Reflect.construct()なぜオブジェクトプロトタイプをオーバーライドする必要がありますか?
- 2. なぜオーバーライド==はequalsをオーバーライドする必要がありますか?
- 3. サブタイプは各サブクラスでオーバーライドする必要があります。
- 4. Symfony 1.3:バックエンドフィルタフィールドのデータをオーバーライドする必要があります
- 5. クラスのインスタンスにメソッドをオーバーライドする必要があります
- 6. エラー「InventMovement.pdsCWRemainPhysicalメソッドをオーバーライドする必要があります」
- 7. このメソッドはスーパークラスメソッドをオーバーライドする必要があります
- 8. 新しいクラスでGetHashCodeとEqualsをオーバーライドする必要がありますか?
- 9. hashCodeとequalsメソッドをcompareToメソッドでオーバーライドする必要がありますか?
- 10. service()またはdoPost()をオーバーライドする必要がありますか?
- 11. 静的メソッドはJavaでオーバーライドする必要がありますか?
- 12. メソッドはオーバーライドする必要がありますが、抽象メソッドではありませんか?
- 13. asmx WebサービスからHTTPレスポンスコードをオーバーライドする必要があります
- 14. java.lang.UnsupportedOperationException:SOAPMessageのすべてのサブクラスでsetPropertyをオーバーライドする必要があります。
- 15. いつequalsメソッドとhashcodeメソッドをオーバーライドする必要がありますか?
- 16. CreateObjRef()をオーバーライドするときに必要なことは?私はする必要がありますか?
- 17. Equalsメソッドをオーバーライドするときに、==および!=演算子をオーバーライドする必要がありますか? (.NET)
- 18. Magento2でカスタムモジュールのphtmlファイルとmagentoテーマテンプレートファイルをオーバーライドする必要があります
- 19. ビューがない場合は、onLayoutをオーバーライドする必要があります
- 20. 子クラスフォーム親クラス(UIButton)のプロパティをオーバーライドする必要があります
- 21. StartActivity型のonInit(int)メソッドはスーパークラスメソッドをオーバーライドする必要があります
- 22. コンパレータ<String>はスーパークラスメソッドをオーバーライドする必要があります
- 23. swift 4.0: 'prepare'をオーバーライドする宣言と同じようにオーバーライドする必要があります。
- 24. メンバを構築する別のクラスでnamspaceにあるメソッドをオーバーライドする必要があります。
- 25. @Overrideで「スーパークラスメソッドをオーバーライドする必要があります」と表示されるのはなぜですか?
- 26. typescriptをes6にコンパイルする必要がありますか?es5にコンパイルする必要があります
- 27. 私のコントローラをオーバーライドすると、どのイベントでクッキーをチェックする必要がありますか?
- 28. File.expand_path(...、__FILE__)がベストプラクティスである必要がありますか?
- 29. ObjectiveCクラスの既定の変数値はどこに設定する必要があります
- 30. winapi - カスタムコントロールを作成するにはCButtonまたはCWndをオーバーライドする必要がありますか?
ケンは言いました。しかし...強調するために、そうすることは非常にまれです。 – bbum