0

スレッドセーフなシングルトン デザイン パターンの更新バージョンを取得しようとしています。これが私が知っている1つのバージョンです。ただし、iOS6で動作させることはできません

これが私がやろうとしていることです:

これが私のクラスメソッドです

 +(id)getSingleton
 {
    static dispatch_once_t pred;
    static EntryContainerSingleton *entriesSingleton = nil;
    dispatch_once(&pred, ^{
        entriesSingleton = [[super alloc] init];

        });

    return entriesSingleton;   
   }

 +(id)alloc
 {
  @synchronized([EntryContainerSingleton class])
  {
      NSLog(@"inside alloc of EntryContainerSingleton");
   ERROR >>>>>  NSAssert(entriesSingleton == nil, @"Attempted to allocate a second instance of a singleton.");
   ERROR >>>>>   entriesSingleton = [super alloc];
   ERROR >>>>>   return entriesSingleton;
   }
  return nil;
  }

  -(id)init
  {
     self = [super init];
     ......Some custom INitialization
     return self;
 }

このコードは、上記のエラーをスローします。エラーメッセージには、宣言されていない識別子の使用が示されています。さらに、上記のリンクはの使用を推奨しています

  [[allocWithZone:nil] init] 

このように使用すると文句を言います

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

それを機能させるために何時間も試みた後。誰かがこれを正しく行う方法を指摘できれば素晴らしいでしょう。私はグーグルで多くの時間を費やしましたが、完全な実装例は見つかりませんでした。

ありがとう

4

1 に答える 1

0

+initialize を使用しないのはなぜですか?

static MyClass *gSingleton;

+(void) initialize {
  if ( self == [MyClass class] ) {
    gSingleton = [MyClass new];     
  }
}

+(MyClass*) getSingleton {
  return gSingleton;
}

スレッドセーフです。唯一の問題は、誰かが alloc/init または new を使用して 2 番目のオブジェクトを割り当てることを妨げないことです。

于 2013-02-03T01:47:35.960 に答える