7

Ho trovato una linea dispari di codice nel progetto REActivityViewController su GitHub e non riesco a capirlo. Sembra evitare di trasmettere il valore alla classe esatta in cui è stato dichiarato, ma non so perché sarebbe necessario. Mi chiedo se sia in qualche modo importante per l'eredità.Spiegazione di autoassegnazione debole usando __typeof

Qualcuno può spiegare perché questo sarebbe stato fatto?

__typeof(&*self) __weak weakSelf = self; 

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

mi piacerebbe fare questo più chiaro dichiarando in questo modo ...

id __weak weakSelf = self; 

E poi all'interno del blocco posso ridichiarare come un riferimento forte.

REPocketActivity* __strong strongSelf = (REPocketActivity*)weakSelf; 

Quindi vorrei utilizzare strongSelf all'interno del blocco. Quando esce dal campo di applicazione, rilascia il riferimento sicuro in modo sicuro.

risposta

4

__typeof(self) è buono per la portabilità, poiché non è associato a una classe specifica, tuttavia il trucco &* sembra decisamente ridondante. Per quanto ne so, in C, e di conseguenza Objective-C, &*ptr è totalmente equivalente a ptr.

Tuttavia, questo non può essere vero in altre lingue C-like come C++, dal momento che gli operatori possono essere sovraccaricati e la semantica potrebbe non essere così semplice come sembra. In effetti ho visto che &* già nelle applicazioni C++, soprattutto quando si tratta di iteratori. La mia ipotesi è che l'autore abbia uno sfondo C++ ed è per questo che ha inserito quel costrutto ridondante.

In ogni caso, potrei sbagliarmi e mi piacerebbe sentire una spiegazione più sofisticata, ce n'è.

+0

Gabriele, sembra una spiegazione ragionevole. Vorrei poter sintassi Google come questo per ottenere un contesto. – Brennan

0

Poiché il tipo di sé in un metodo Objective-C è sempre un tipo di puntatore, __typeof (& * self) è ridondante anche in Objective-C++. __typeof (self) dovrebbe sempre funzionare.

+0

Un'altra opzione sarebbe quella di utilizzare la parola chiave automatica che è ora supportata nelle versioni più recenti di Objective-C: 'auto __weak weakSelf = self;' –