私は、静的オブジェクトを作成するためにdispatch_once
を使用するクラスメソッドを持っています。 dispatch_once
ブロック内で私は[self class]
を使用し、保持サイクルを避けるためにself
の弱い参照を使用する必要があるのだろうかと疑問に思っていましたか?クラスメソッドselfがブロック内で使用される場合
+ (NSArray *)accountNames{
static NSArray *names = nil;
static dispatch_once_t predicate;
__weak TUAccount *wself = self;
dispatch_once(&predicate, ^{
names = [[[wself class] accounts] allKeys];
names = [names sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
});
return names;
}
互換性のないポインタ型の初期化:私はself
に弱い参照を使用している場合
+ (NSArray *)accountNames{
static NSArray *names = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
names = [[[self class] accounts] allKeys];
names = [names sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
});
return names;
}
は私が警告を受けます
私は警告を受けるので、私はこの場合にはself
に弱い参照を使う必要はないと思っていますが、私は皆さんの考えを見たいと思っていました。
ありがとう、なぜ私はいくつかのクラスメソッドに 'self'を使用しても動作しない理由が分かりません。なぜなら私は' [self class] 'を使ってすべてのクラスメソッドを呼び出すのです。 – keegan3d
あなたのクラスメソッド、あるいはアップルのフレームワークにあるクラスメソッド? 「うまくいかない」とはどういう意味ですか?おそらく理由がある。 –
これはメソッドがどこから呼び出されたかに基づいています。 'accounts'クラスメソッドの場合、これは私自身のクラスメソッドです。他のクラスのメソッドから '[self accounts]'で呼び出すことはできますが、インスタンスメソッドでは '[[self class] accounts]'を使わなければなりません。したがって、上のサンプルコードでは、それはちょうど '[self accounts]'である可能性があります。 – keegan3d