2011-05-16 3 views
0

J'essaie de passer un pointeur par référence à un objet de la classe A à la classe B. Dans la classe B, je veux assigner ce pointeur à un ivar et le lire et écrire dessus.Passer un pointeur par référence à la classe et l'utiliser

Ceci est le code qui me donne des erreurs (peu importe quelles erreurs). C'est mon premier essai avec des pointeurs alors s'il vous plaît corriger ma compréhension.

Class A 

//This is the parameter I would like to pass as a pointer and be able to manipulate from class B 
NSString *name = @"Cyprian"; 

-(void)passAParameter{ 

    ClassB *classB = [[ClassB alloc] initWithAPointer:&name]; 
    ... 
} 


Class B 

// ClassB.h 
@interface ClassB{ 

    NSString **nameFromClassA; 
} 
@property(nonatomic,assign)NSString **nameFromClassA; 

-(id)initWithAPointer:(NSString **)name; 
// ClassB.m 


@implementation ClassB 

@synthesize nameFromClassA; 

-(id)initWithAPointer:(NSString **)name{ 
    *nameFromClassA = *name; 
} 

//Print the name 
-(void)printName{ 
    NSLog(@"Name: %@", *nameFromClassA); 
} 

//Will this change the name in class A? 
-(void)changeNameInClassA:(NSString* newName){ 
    *nameFromClassA = newName; 
} 

Répondre

2

Veuillez ne pas utiliser de double pointeur ici. Vous ne devriez pas gérer des choses comme ça. Ce est une approche plus simple:

Dans le cas ClassA:

-(void)passAParameter{ 
    NSString *name = @"Cyprian"; 
    ClassB *classB = [[ClassB alloc] initWithAPointer:name]; 
    ... 
} 

Pendant que vous définissez ClassB cette façon: ClassB.h:

@interface ClassB{  

    NSString *nameFromClassA; 
} 
@property(nonatomic,retain) NSString *nameFromClassA; // Retaining it will give you less headaches 

-(id)initWithAPointer:(NSString *)name; 
@end 

ClassB.m:

@implementation ClassB 

@synthesize nameFromClassA; 

// You should release all retained object when deallocating self 
- (void) dealloc { 
    [nameFromClassA release]; 
    nameFromClassA = nil; 
    [super dealloc]; 
} 

-(id)initWithAPointer:(NSString *)name{ 
    if ((self = [super init])) {  // Always init the object from super! 
     self.nameFromClassA = name; // Retain the object calling self. 
    } 
    return self; 
} 

//Print the name 
-(void)printName{ 
    NSLog(@"Name: %@", nameFromClassA); 
} 

//Will this change the name in class A? 
-(void)changeNameInClassA:(NSString* newName){ 
    self.nameFromClassA = newName; // Retain it calling self. 
} 

@end 
+0

Eh bien, je suppose que je ne me suis pas rendu suffisamment clair. Je veux passer une valeur par référence donc j'utilise des doubles pointeurs sur le but. J'essaie de passer un nom par référence afin que je puisse le lire et lui écrire dans la classe B. – Cyprian

+1

Si vous le passez comme je l'ai exposé ici, chaque changement de 'name' dans' ClassA' passera à ' nameFromClassA' dans 'ClassB', puisque vous utilisez naturellement un pointeur pour faire référence à cette chaîne. Vous initialisez 'ClassB' en utilisant le pointeur vers la mémoire qui" contient "la chaîne (en fait vous définissez la chaîne comme' NSString * name' et non 'NSString name'). – marzapower

+0

S'il vous plaît, essayez-le et laissez-moi savoir si vous avez des difficultés. – marzapower

1

L'affectation dans votre méthode initWithAPointer: doit être juste:

nameFromClassA = name; 

Cela dit, ce modèle de code odeurs d'une mauvaise conception. Quel objectif de haut niveau est-ce que vous essayez d'accomplir?

+0

Ok, j'essaie d'ouvrir un e universel ditor qui éditera un titre de cellules de table, donc je voudrais passer la cellule de table par référence et lire et écrire à partir de mon éditeur – Cyprian

+0

Ensuite, vous devez passer la cellule de table (en utilisant un pointeur d'objet normal comme '(UITableViewCell *)') et mettez à jour la propriété title de la cellule. Ou, probablement mieux encore, vous devriez concevoir un protocole de délégué par lequel votre éditeur universel notifie le contrôleur de vue qui contient la cellule lorsque le titre change. –

Questions connexes