Mam metodę klasy, która używa dispatch_once
do utworzenia statycznego obiektu. Wewnątrz bloku dispatch_once
używam [self class]
i zastanawiałem się, czy muszę użyć słabego odniesienia do self
, aby uniknąć cyklu zatrzymania?Metoda klasy self, jeśli jest używana w bloku
+ (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;
}
Jeśli używam słabe odniesienie do self
otrzymuję ostrzeżenie:
+ (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;
}
niezgodne typy wskaźnik inicjowanie 'TUAccount * __ słaby' z wyrazem typu 'const klasy'
Ponieważ dostaję ostrzeżenie, nie sądzę, żebym musiał użyć słabego odniesienia do self
w tym przypadku, ale chciałem zobaczyć, co wy myśleliście.
Dzięki, nie jestem pewien, dlaczego, ale przy użyciu 'self' dla niektórych metod klasy nie działa, dlatego używam' [self class] 'do wywoływania wszystkich metod klasy. – keegan3d
Jakieś metody klasy w szczególności - twoje lub te w frameworkach Apple'a? A co masz na myśli mówiąc "nie działa"? Prawdopodobnie jest jakiś powód. –
OK zależy od miejsca wywołania metody. Na przykład dla metody klasy 'accounts', która jest moją własną metodą klasy. Mogę nazywać to przez "[self accounts]" z innych metod klasy, ale muszę używać '[[self class] kont]' w metodach instancji. Więc masz rację w powyższym przykładowym kodzie, może to być po prostu "[self accounts"]. – keegan3d