0

私はシングルトンを作成しています:ブロック内の[self new]は強い参照サイクルを作成しますか?以下に示すよう

static MyType* shared = nil; 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    shared = [self new]; 
}); 
return shared; 

Iは、ブロック内のコードが一度実行され、self、その時点でnilであろうことを知っているので、[self new][MyType new]に等しくなります。しかし、私は状況について考えていましたが、[self new]をブロック内で呼び出すと、シングルトンの目的ではなく、複数回呼び出すことができます。

will [self new][MyType new]のように動作するか、ブロックにはselfが記録されますか? [self new]を使用してMyTypeの新しいインスタンスを作成するのは正しい方法ですか? [MyType new]の代わりに[self new]を使用した場合のメリットは何ですか?

+0

を。あなたがそれの外に[self new]を呼びたいならば、シングルトンを作ることに意味はありません。 –

+0

@TejaNandamuri質問は、 "それは[自己新鮮な]を使用するブロックは、自己をキャプチャするだろうか?"、申し訳ありませんが問題の明確化されていない場合。 – WantToKnow

+0

いいえ、selfを使用してブロックを呼び出さない限り、強い参照は作成されません。ブロック内で自己を呼びたい場合は弱者を使うべきです。それはここで最善のものです。http://stackoverflow.com/questions/20030873/always-pass-weak-reference-of-self-into-block-in-arc –

答えて

0

[MyType new]のように行動するか、ブロックが自己をキャプチャしますか?

他の回答に記載されているように、これは保持サイクルではありません。ただし、selfはクラスオブジェクトを指しており、クラスオブジェクトはARCのオブジェクトではないことに注意してください。永遠のライフタイムを持っています。

[self new]を使用してMyTypeの新しいインスタンスを作成するのは正しい方法ですか?

これが良い方法です。下記参照。

[MyType new]の代わりに[self new]を使用するメリットはありますか?クラスごべきほとんど常に代わりに使用MyTypeselfの実装インサイド

。 (ただし、あなたのコードは、静的変数のためにそうする利点がないまれな例の1つです)。

この理由は、そのコードをサブクラスで使用できるからです。コードに具体的な型を入れると、すべての作成メソッドを上書きする必要があり、コードが多くなり、基底クラスの問題が壊れてしまいます。

例:

@implementation BaseClass 
+ (instancetype)new… 
{ 
    BaseClass *instance = [BaseClass new]; 
    … 
} 
@end 

@interfac Subclass : BaseClass 
… 
@end 

これが壊れている、...なぜなら

id instance = [Subclass new…]; 

...サブクラスのインスタンスを作成します。

あなたは別の問題があるものを、new…を上書きする必要があります:あなたは新しいインスタンスを作成している、あなたのシングルトンinitメソッドの外に]あなたは新しい自己を呼び出すとき

@implementation Subclass 
+(instancetype)new… 
{ 
    /* Subclass *instance = [super new]; Does NOT work*/ 
    … Complete re-implementation of +new… (BaseClass) 
} 
1

いいえ「サイクル」はありません。ブロックはクラスオブジェクトへの強い参照を取得します(これはクラスメソッドであるため、selfがここを指しています)。クラスオブジェクトはブロックへの参照を保持しません。

0

はい、selfはブロックによってキャプチャされますが、ブロックはselfでキャプチャされないため、リリースサイクルはありません。とにかく、selfMyTypeのクラスオブジェクトを指しているため、クラスオブジェクトの割り当てが解除されないため、この特定のシナリオでは保持サイクルについて心配する必要はありません。

関連する問題