0

シングルトンキャッシュのアイデアをいじっています。セットアップは非常に簡単です。

私のシングルトン クラスでは、次のように 1 つのインスタンスをインスタンス化しています。

+(SharedInstanceTest*)sharedInstace
{
    static SharedInstanceTest *sharedInstace=nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstace=[[SharedInstanceTest alloc]init];
    });
    NSLog(@"Share Instance Allocated");

    return sharedInstace;
}


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

rootViewController では、インスタンス化されていることを確認するために NSLog を確認できるように、sharedInstance を呼び出しています。

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [SharedInstanceTest sharedInstace];

}

NSLog を取得しません。理由はありますか?

4

2 に答える 2

2

オーバーライドしないでくださいallocWithZone。実行すると、おそらくループまたは何かが発生しています[SharedInstanceTest alloc]

于 2013-06-09T16:09:43.423 に答える
0

allocWithZone:クライアントがそれ以上インスタンスを作成できないようにするためにオーバーライドできます。allocを使用して共有インスタンスを作成することはできませんallocWithZone:。次に、SB として無限ループがあります。と答えました。

次のようなことができます (ARC に変換するには、 in を削除するだけretainですallocWithZone:):

#import "MySingleton.h"

static MySingleton * defaultMySingleton = nil;

//MySingleton * defaultMySingleton = nil;
//void initialize_defaultMySingleton(void) {
//    [MySingleton defaultMySingleton];
//}

@implementation MySingleton

+ (MySingleton *)defaultMySingleton {

    // Create the instance if it has not been already.
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // Call super's implementation because allocWithZone: is overridden
        // to call defaultMySingleton
        // The class owns this instance.
        defaultMySingleton = [[super allocWithZone:NULL] init];
    });

    return defaultMySingleton;
}

+ (id)allocWithZone:(NSZone *)zone {
    // Users of alloc, although they shouldn't be using this,
    // will expect a +1 retain count. Bump it to allow for eventual release.
    return [[self defaultMySingleton] retain];
}

- (id)init
{
    // If defaultMySingleton exists, then it is self here. Just return it.
    if( defaultMySingleton ) return defaultMySingleton;

    // Otherwise, do normal setup.
    self = [super init];
    if( !self ) return nil;

    return self;
}

@end

これはPeter Hosey の singleton blog postに触発されたものですが、私が最後に読んだときから彼は実装をかなり変更したようです。

于 2013-06-09T19:05:53.073 に答える