2009-09-26 2 views
6

Vorrei dichiarare un puntatore a un puntatore nell'obiettivo-c.Puntatore a un puntatore nell'obiettivo-c?

Ho una variabile di istanza (primaryConnection) che deve essere aggiornata dinamicamente per puntare a una variabile locale quando cambia.

NSURLConnection *primaryConnection; 

-(void) doSomething 
{ 
    NSURLConnection *conn; 
    primaryConnection = conn; 

    conn = // set by something else 

    // primaryConnection should now reflect the pointer that conn is pointing to, set by something else... but it doesn't? 
} 

È possibile dichiarare un puntatore a un puntatore in qualche modo? O mi sta sfuggendo qualcosa?

risposta

24

Quasi mai si vorrebbe mai farlo, l'unica eccezione tipica è quando si vuole passare un riferimento come argomento che può essere compilato. Vedere l'uso di (NSError **) attraverso le API.

In particolare, è necessario non voler dichiarare una variabile di istanza come NSConnection ** e quindi impostarla da un'altra parte; da qualche parte fuori dall'oggetto. Ciò interrompe totalmente l'incapsulamento ed è un chiaro segnale che il tuo codice è scadente o, per lo meno, stranamente progettato.

Prova a modificare:

@interface MyClass:NSObject 
{ 
    NSConnection *connection; 
} 

@property(retain) NSConnection *connection; 
@end 

@implementation MyClass 
@synthesize connection; 
@end 

e in qualunque classe di codice/ha bisogno di impostare la connessione:

@implementation SomeOtherClass 
- (void) configureConnection: (MyClass *) anObject 
{ 
    NSConnection *aConnection; 

    aConnection = ... initialize the connection ... 

    anObject.connection = aConnection; 
} 
@end 

che preserverà l'incapsulamento e lasciare qualcosa di diverso per impostare la connessione per MyClass. Se questo non risolve il tuo problema, dovrai dirci cosa stai cercando di fare.

0

Si assegna il valore del puntatore di conn-primaryConnection prima di aver impostato conn, così conn e quindi primaryConnection probabilmente puntare a spazzatura.

Ricordare che è necessario conservare l'oggetto NSURLConnection prima di memorizzarlo come variabile di istanza, altrimenti l'oggetto verrà probabilmente rilasciato in anticipo. Quindi, rilasciare il vecchio primaryConnection, quindi assegnargli un nuovo oggetto, ma anche conservare il nuovo oggetto.

0

È necessario impostarlo su conn dopo aver impostato conn dove si desidera.

5

dichiareremo come:

NSURLConnection **primaryConnection; 

Imposta come:

primaryConnection = &conn; 

Questa è roba C pianura, e non specifiche per Objective-C. Per accedere primaryConnection, è necessario dereferenziarlo prima dell'invio di messaggi ad esso:

NSURLConnection * theConn = *primaryConnection; 
[theConn doSomethingElse]; 

Nota, però che dal codice sorgente incollato, questo potrebbe non essere sicuro. Sembra che tu voglia avere doSomething su un thread, accedere a una variabile locale e usare primaryConnection da altri thread per ottenere un riferimento a quella variabile locale? Perché non trasformarlo in una normale variabile di istanza?

+1

Vedere la mia risposta; è quasi garantito che la persona che pone la domanda desideri un puntatore a un puntatore per i motivi sbagliati. – bbum