3

したがって、私はシングルトンを持っており、Imはこれら2つの実装の違いを理解しようとしています:機能的には、両方でコードを実行しようとしましたが、両方とも機能します

ただし、最初の実装では、[self alloc]が呼び出されず、代わりに[superalloc]が呼び出されることに気付きました。これに少し当惑しています。それはうまくいくようですが、それは少し魔法のように見えるので、誰かが明確にすることができるかどうか疑問に思っています

1番目の方法:

 +(id)getSingleton
 {

    static dispatch_once_t pred;
    dispatch_once(&pred, ^{
    locMgrSingleton = [[super alloc] init];

        });

     return locMgrSingleton;

 }

別の方法

 +(id)getSingleton
 {
     @synchronized(self)
     {
         if (locMgrSingleton == nil)
         {
             locMgrSingleton = [[self alloc]init];
             NSLog(@"Created a new locMgrSingleton");
         }
         else
        {
            NSLog(@"locMgrSingleton exists");
         }

     }

     return locMgrSingleton;
 }
4

3 に答える 3

4

クラスもオーバーライドしない限り、[self alloc]vsを使用しても違いはありません。そうは言っても、それは呼び出す必要があります。これはおそらく、シングルトンを返すようにオーバーライドする実装から適応されたものであるため、呼び出しているに違いありません。[super alloc]+alloc[self alloc]super+alloc

selfいずれにせよ、 vs以外の2つのパターンの違いは、この他の質問superに対する私の答えで説明されていますが、要するに、これを行うための現代的な方法です。よりも高速で、より意味的な意味を持ちます。dispatch_once()@synchronized

于 2013-02-14T21:53:53.653 に答える
1

In a class method, self points to the class itself. In both of your implementations, [self alloc], [MySingleton alloc] and [super alloc] are all semantically equivalent—unless you for some odd reason override +alloc.

One reason you might want to use [super alloc] over others is when you explicitly mark +alloc unavailable in your declaration with a compiler directive:

+(instancetype) alloc __attribute__((unavailable("alloc not available")));

or

+(instancetype) alloc NS_UNAVAILABLE;

Otherwise, compiler will raise an error when you try to +alloc an instance of your singleton class—and that's usually what you want except for when you +alloc a shared singleton instance in dispatch_once.

于 2015-05-30T04:57:51.573 に答える
1

たとえばhttp://cocoasamurai.blogspot.fi/2011/04/singletons-your-doing-them-wrong.htmlで述べたように、dispatch_once呼び出しは@synchronized(self).

[super alloc]の代わりに、それが特定のバージョンに適用され、他のバージョンには適用されない理由[self alloc]はわかりませんdispatch_once。静的メソッドでselfは、クラス自体 (およびsuperその直接のスーパークラス) を参照するだけであり、実際のクラス名を記述するための省略形と見なすだけです。

[self alloc]ただし、そうでなければスーパークラスではなく現在のクラスの名前を書いていたので、私はこれまでにしか使用したことがありません。具体的に呼び出す[super alloc]ことに特別な意味があるかどうかはわかりません。

于 2013-02-14T21:55:02.023 に答える