2010-04-15 5 views
0

Une application iPhone sur laquelle je travaille se termine périodiquement ... et j'ai l'impression que c'est parce que j'accède à un NSArray partagé parmi plusieurs contrôleurs de vue . Donc ...Comment passer correctement NSArray/NSMutableArray d'un UIViewController à un autre

Quelle est la meilleure façon de passer NSArray/NSMutableArray parmi plusieurs ViewControllers ... qui peuvent tous le modifier et/ou le mettre à zéro ou quoi que ce soit?

Merci

Répondre

3

Il y a deux approches, en général.

Dans la première approche, lorsque vous instanciez votre contrôleur suivant la vue, vous pouvez définir une propriété de tableau à « hériter » du courant (bientôt à être antérieur ou parent) contrôleur de vue:

MyNextViewController *_myNextViewController = [[MyNextViewController alloc] initWithNibName:@"MyNextViewController" bundle:nil]; 
_myNextViewController.myViewControllerArray = self.myViewControllerArray; 
... 

Dans la seconde approche, vous pouvez créer une propriété myAppDelegateArray dans votre délégué d'application, en l'instanciant lorsque l'application est initialisée (ou instanciée ailleurs, à la demande).

Vous pouvez ensuite appeler le getter pour cette propriété à partir de n'importe quelle classe, y compris les contrôleurs de vue.

Par exemple, dans une instance de MyNextViewController, vous pourriez avoir une propriété appelée myViewControllerArray et vous définiriez comme suit:

self.myViewControllerArray = [UIAppDelegate myAppDelegateArray]; 

vous ajouteriez une déclaration #define fichier quelque part dans vos constantes d'application, par exemple:

#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate) 

ou utiliser le plein [UIApplication sharedApplication].delegate appel, si vous préférez. En règle générale, les gens semblent préférer l'approche de délégué d'application, car elle décentralise l'accès à la propriété désirée. Avec cette approche, si vous réorganisez vos contrôleurs de vue ou insérez de nouveaux contrôleurs de vue dans votre hiérarchie VC, vous n'avez pas besoin de déboguer les propriétés du contrôleur de vue enfant héritées des contrôleurs de vue parents, car une référence est toujours disponible. déléguer.

+0

Personnellement, je ne recommande jamais l'approche «utiliser l'application déléguer comme un Globals.h» parce que ce n'est pas une bonne technique de conception pour enseigner aux gens. L'utilisation de propriétés de classe pour transmettre des objets est beaucoup plus ordonnée. –

+0

Je suis vraiment intéressé d'entendre les avantages et les inconvénients de ces modèles. Je suis de deux avis à propos d'eux et je me suis orienté vers l'utilisation de l'approche de délégué d'application récemment, car je réutilise plus de mon code. –

+0

Par curiosité ... quel est le meilleur moyen de réinitialiser un NSArray partagé qui est transmis? Faire une sortie ou juste mettre à zéro? Aussi, quel est l'effet si je mets un NSarray = nil dans le Contrôleur A IF le Contrôleur B et C ont une retenue dessus? Merci – wgpubs

0

vous n'êtes probablement pas retenue, il sera désallouée et que vous essayez d'y accéder à nouveau. essayez d'envoyer un [myArray retain] là où vous l'utilisez (dans chacun des contrôleurs), et [myArray release] quand vous avez terminé

Questions connexes