2014-10-07 15 views
7

Utilizzando il modello weakSelf/strongSelf per evitare di creare una conservano ciclo in blocchi, questo codice è piuttosto comune:Uso typeof (auto) in blocchi Objective-C per dichiarare un riferimento forte

typeof(self) __weak weakSelf = self; 
void (^block)() = ^{ 
    typeof(weakSelf) strongSelf = weakSelf; 
    // ...more code... 
}; 

La domanda è, cambia il secondo typeof(weakSelf) a typeof(self) causa self da catturare nel blocco?

Ad esempio:

typeof(self) __weak weakSelf = self; 
void (^block)() = ^{ 
    typeof(self) strongSelf = weakSelf; // does using typeof(self) here end up capturing self? 
    // ...more code... 
}; 

Se sé non viene catturata, non v'è alcun motivo per preferire un modo o l'altro?

risposta

4

Non funziona. Quello che Ken ha detto su typeof si applica a un'espressione in fase di compilazione.

Qui c'è anche un pezzo di codice che lo dimostra:

#import <Foundation/Foundation.h> 

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
    NSObject *o = [NSObject new]; 

    __weak typeof(o) weakO = o; 
    void(^b)() = ^{ 
     __strong typeof(o) strongO = weakO; 
     NSLog(@"o: %@", strongO); 
    }; 

    o = nil; 
    b(); 
    /* outputs: 
     2015-05-15 16:52:09.225 Untitled[28092:2051417] o: (null) 
    */ 
    } 
} 
Non
+0

Conosci un modo per convertirlo in forte? Ho provato __strong typeof (weakSelf) strongSelf = weakSelf; e non ha funzionato, è stato deallocato perché deve essere ancora debole. Il motivo per cui lo chiedo è che non sto usando me stesso, ne ho bisogno per un blocco, ma come soluzione alternativa posso solo definire il tipo completo. – malhal

8

Non dovrebbe. Se lo fa, è un bug del compilatore.

L'espressione typeof non fa effettivamente riferimento alla variabile self o al suo valore. È strettamente un riferimento al tipo dell'espressione, non al suo valore. L'espressione è strettamente un costrutto in fase di compilazione che non sopravvive nel codice compilato.

Preferirei typeof(self), personalmente, ma non credo che ci sia un argomento valido per preferire l'uno o l'altro.

+0

che io non ti credo, ma sarebbe bello avere un po 'di prove a sostegno di ciò che si pensa. – smileyborg

Problemi correlati