7

Znalazłem nieparzystą linię kodu w projekcie REActivityViewController na GitHub i nie mogę tego zrozumieć. Wydaje się, że unika się rzucania wartości do dokładnej klasy, w której została zadeklarowana, ale nie wiem, dlaczego byłaby taka konieczność. Zastanawiam się, czy jest to jakoś ważne dla dziedziczenia.Wyjaśnienie słabego przypisania siebie za pomocą __typeof

Czy ktoś może wyjaśnić, dlaczego tak się stało?

__typeof(&*self) __weak weakSelf = self; 

https://github.com/romaonthego/REActivityViewController/blob/master/REActivityViewController/REPocketActivity.m

bym to bardziej oczywiste, deklarując to w ten sposób ...

id __weak weakSelf = self; 

I wtedy w bloku mogę redeclare go jako silnego odniesienia.

REPocketActivity* __strong strongSelf = (REPocketActivity*)weakSelf; 

Wtedy użyłbym strongSelf w bloku. Kiedy wychodzi poza zakres, bezpiecznie odrzuca silne referencje.

Odpowiedz

4

jest dobry do przenoszenia, ponieważ nie jest powiązany z określoną klasą, niemniej jednak sztuczka wygląda na zbędną. O ile mi wiadomo, w C, a w konsekwencji Objective-C, &*ptr jest całkowicie równoważne z ptr.

Jednak może to nie być prawdą w innych językach podobnych do języka C, takich jak C++, ponieważ operatory mogą być przeciążone, a semantyczne może nie być tak proste, jak to wygląda. W rzeczywistości widziałem już te aplikacje w aplikacjach &*, szczególnie w przypadku iteratorów. Domyślam się, że autor ma tło C++ i dlatego wstawił tę zbędną konstrukcję.

W każdym razie, może się mylę i chciałbym usłyszeć bardziej wyrafinowane wyjaśnienie, jest takie.

+0

Gabriela, to wydaje się rozsądnym wyjaśnieniem. Chciałbym mieć taką składnię Google, aby uzyskać jakiś kontekst. – Brennan

0

Ponieważ typ self w metodzie Objective-C jest zawsze typem wskaźnika, __typeof (& * self) jest zbędny nawet w Objective-C++. __typeof (self) powinien zawsze działać.

+0

Inną opcją byłoby użycie słowa kluczowego auto, które jest teraz obsługiwane w najnowszych wersjach Objective-C: 'auto __weak weakSelf = self;' –

Powiązane problemy