2009-09-26 23 views
6

me gustaría declarar un puntero a un puntero en Objective-C.Puntero a un puntero en objetivo-c?

I tienen una variable de instancia (primaryConnection) que debe ser actualizado dinámicamente para que apunte a una variable local cuando 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? 
} 

¿Es posible declarar un puntero a un puntero de alguna manera? ¿O me estoy perdiendo algo?

Respuesta

24

Casi nunca desea hacer esto, la excepción típica es cuando desea pasar una referencia como un argumento que puede rellenarse. Consulte el uso de (NSError **) en todas las API.

En particular, usted hace no desea declarar una variable de instancia como NSConnection ** y luego configurarlo en otro lugar; en algún lugar fuera del objeto. Eso rompe por completo la encapsulación y es una señal segura de que su código es pobre o, al menos, extrañamente diseñado.

Tal vez puedas probar:

@interface MyClass:NSObject 
{ 
    NSConnection *connection; 
} 

@property(retain) NSConnection *connection; 
@end 

@implementation MyClass 
@synthesize connection; 
@end 

y en cualquier clase de código/necesita establecer la conexión:

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

    aConnection = ... initialize the connection ... 

    anObject.connection = aConnection; 
} 
@end 

que preservarán la encapsulación y permitir algo más para configurar la conexión de MiClase. Si esto no resuelve su problema, deberá decirnos qué es lo que realmente está tratando de hacer.

0

Se asigna el valor del puntero de conn a primaryConnection antes de haber establecido conn, por lo conn y por lo tanto primaryConnection probablemente apuntará a la basura.

Tenga en cuenta que usted tiene que retener el objeto NSURLConnection antes de almacenarla como variable de instancia, de lo contrario el objeto probablemente se dará a conocer a principios. Así liberar el viejo primaryConnection, y luego asignar un nuevo objeto a la misma, sino también retener el nuevo objeto.

0

Es necesario que ajuste a conn después conn se ha ajustado a donde desee.

5

declararemos como:

NSURLConnection **primaryConnection; 

Establecer como:

primaryConnection = &conn; 

Esto es algo sencillo C, y no es específico de Objective-C. Para acceder a primaryConnection, es necesario eliminar la referencia antes de enviar mensajes a ella:

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

Tenga en cuenta, sin embargo, que a partir del código fuente que ha pegado, esto puede no ser seguro. Parece que desea tener doSomething en un hilo, el acceso a una variable local, y está usando primaryConnection de otros hilos para obtener una referencia a esa variable local? ¿Por qué no simplemente convertirlo en una variable de instancia normal?

+1

Ver mi respuesta; está casi garantizado que la persona que hace la pregunta no quiere un puntero a puntero por las razones equivocadas. – bbum

Cuestiones relacionadas