6

BNRItemStoreはシングルトンであり、なぜsuper allocWithZone:プレーンオールドの代わりに呼び出されなければならないのか混乱しましたsuper alloc。そして、allocの代わりにオーバーライドしますallocWithZone

#import "BNRItemStore.h"

@implementation BNRItemStore

+(BNRItemStore *)sharedStore {
    static BNRItemStore *sharedStore = nil;

    if (!sharedStore)
        sharedStore = [[super allocWithZone: nil] init];

    return sharedStore;
}

+(id)allocWithZone:(NSZone *)zone {
    return [self sharedStore];
}

@end
4

2 に答える 2

10

[super alloc]にコールスルーしallocWithZone:ます。これは、他のことを行うためにオーバーライドしました。allocWithZone:オーバーライドされたバージョンではなく、スーパークラスの実装(そこに必要なもの)を実際に取得するには、allocWithZone:明示的に送信する必要があります。

キーワードは;superと同じオブジェクトを表します。self現在のクラスではなく、スーパークラスで対応するメソッドの検索を開始するようにメソッドディスパッチメカニズムに指示するだけです。

したがって、[super alloc]スーパークラスに移動し、そこに実装を取得します。これは次のようになります。

+ (id) alloc
{
    return [self allocWithZone:NULL];
}

ここでは、selfまだカスタムクラスを表しているため、オーバーライドallocWithZone:が実行され、プログラムが無限ループになります。

于 2012-08-15T01:20:13.437 に答える
3

Appleのドキュメントから:

この方法は歴史的な理由で存在します。メモリゾーンはObjective-Cでは使用されなくなりました。

于 2013-10-11T07:39:34.433 に答える