2009-09-26 9 views
6

Je voudrais déclarer un pointeur sur un pointeur dans objectif-c.Pointeur vers un pointeur dans l'objectif-c?

J'ai une variable d'instance (primaryConnection) qui doit être mise à jour dynamiquement pour pointer vers une variable locale lorsqu'elle change.

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? 
} 

Est-il possible de déclarer un pointeur sur un pointeur? Ou est-ce que je manque quelque chose?

Répondre

24

Vous n'avez pratiquement jamais envie de faire cela, l'exception typique est quand vous voulez passer une référence comme un argument qui peut être rempli. Voir l'utilisation de (NSError **) dans toutes les API.

En particulier, vous voulez pas déclarer une variable d'instance comme NSConnection **, puis définissez-le ailleurs; quelque part en dehors de l'objet. Cela brise totalement l'encapsulation et est un signe certain que votre code est mal ou, au moins, bizarrement conçu.

Essayez ceci:

@interface MyClass:NSObject 
{ 
    NSConnection *connection; 
} 

@property(retain) NSConnection *connection; 
@end 

@implementation MyClass 
@synthesize connection; 
@end 

Et quelle que soit la classe/code doit définir la connexion:

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

    aConnection = ... initialize the connection ... 

    anObject.connection = aConnection; 
} 
@end 

Cela permettra de préserver l'encapsulation et laisser quelque chose d'autre à mettre en place la connexion pour MyClass. Si cela ne résout pas votre problème, vous devrez nous dire ce que vous essayez réellement de faire.

0

Vous attribuez la valeur du pointeur de conn-primaryConnection avant que vous ayez mis conn, donc conn et donc primaryConnection pointera probablement aux déchets. Gardez à l'esprit que vous devez conserver l'objet NSURLConnection avant de le stocker en tant que variable d'instance. Dans le cas contraire, l'objet sera probablement libéré trop tôt. Libérez donc l'ancienne primaryConnection, puis attribuez-lui un nouvel objet, mais conservez également le nouvel objet.

0

Vous devez le définir sur conn une fois que le connecteur a été défini comme vous le souhaitez.

5

déclarerons comme:

NSURLConnection **primaryConnection; 

définiriez comme suit:

primaryConnection = &conn; 

Ce sont des choses C ordinaire, et non spécifique à Objective-C. Pour accéder primaryConnection, vous devez déréférencer avant d'envoyer des messages à ce:

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

Notez bien que de votre code source que vous avez collé, cela peut ne pas être en sécurité. Il semble que vous souhaitez avoir doSomething sur un thread, accéder à une variable locale et utilisez primaryConnection à partir d'autres threads pour obtenir une référence à cette variable locale? Pourquoi ne pas en faire une variable d'instance normale?

+1

Voir ma réponse; il est presque garanti que la personne qui pose la question veut un pointeur vers un pointeur pour de mauvaises raisons. – bbum

Questions connexes