2012-12-08 1 views
0

Ok, donc je travaille avec deux ensembles de données qui sont extrêmement similaires, et en même temps, ces ensembles de données sont tous deux NSMutableArrays globaux dans l'objet. Deux nouveaux NSMutableArrays sont chargés, qui doivent être ajoutés aux anciennes données existantes. Ces tableaux sont également globaux.Utilisation de pointeurs pour ajuster les objets globaux dans objectif-c

xml_dataset_one = [[NSMutableArray alloc] init]; 
xml_dataset_two = [[NSMutableArray alloc] init]; 

Pour réduire la duplication de code (et parce que ces ensembles de données sont si similaires) j'ai écrit une méthode de vide au sein de la classe pour gérer le processus de combinaison de données pour les deux tableaux:

-(void)constructData:(NSMutableArray *)data fromDownloadArray:(NSMutableArray *)down withMatchSelector:(NSString *)sel_str 

Maintenant, J'ai une compréhension décente de la programmation orientée objet, donc je pensais que si je devais invoquer la méthode avec les tableaux globaux dans les données comme si ...

[self constructData:data_set_one fromDownloadArray:xml_dataset_one withMatchSelector:@"id"]; 

Ensuite, le NSMutableArrays global (data_set_one) refléterait les modifications apportées à "array" dans la méthode. Malheureusement, ce n'est pas le cas, data_set_one ne reflète pas les changements (ex: nouveaux objets dans le tableau) en dehors de la méthode.

Voici un extrait de code du problème

// data_set_one is empty 
// xml_dataset_one has a few objects 

[constructData:(NSMutableArray *)data_set_one fromDownloadArray:(NSMutableArray *)xml_dataset_one withMatchSelector:(NSString *)@"id"]; 

// data_set_one should now be xml_dataset_one, but when echoed to screen, it appears to remain empty 

Et voici l'essentiel du code de la méthode, toute aide est appréciée.

-(void)constructData:(NSMutableArray *)data fromDownloadArray:(NSMutableArray *)down withMatchSelector:(NSString *)sel_str { 
    if ([data count] == 0) { 
     data = down; // set data equal to downloaded data 
    } else if ([down count] == 0) { 
     // download yields no results, do nothing 
    } else { 
     // combine the two arrays here 
    } 
} 

Ce projet n'est pas compatible ARC.

Merci pour l'aide les gars! Rob

+0

Qu'est-ce que vous voulez faire? –

+0

Je veux que data_set_one conserve la valeur donnée par la méthode void. Il est passé et est ensuite modifié via le pointeur "data". Le problème est, les modifications apportées aux données ne sont pas apportées à data_set_one. Modifier, désolé, je trouve difficile d'expliquer ma question:/ – Rob

+0

Vous devez conserver sa valeur. newValue = oldValue, où oldValue est libéré, les résultats sont nuls à newValue. C'est le problème ici. –

Répondre

0

Si j'ai compris votre problème, vous essayez de passer votre objet comme un appel par référence et en espérant travailler comme en C++/C. Mais Obj-C, bien que similaire, mais a une manière différente. Vous devez déréférencer l'objet en utilisant ** (double pointeur) comme vu principalement dans le cas de NSError, ce qui est très rare.

La seconde méthode est: la méthode wrap en tant que bloc. Placez ensuite la variable dans la même portée lexicale que le bloc et notez-la par le type de stockage __block.

La troisième façon peut être d'accéder directement à votre objet en en faisant une propriété/un ou même un singleton.

+0

Merci pour l'aide, finalement réussi à le contourner et le double pointeur a fait l'affaire! – Rob

Questions connexes