Où puis-je créer des variables globales pour une application iOS?

Voici mon code:

Je veux être capable de créer un NSMutableArray global qui peut stocker des objects Budget * qui peuvent ensuite être écrits dans un file .pList … J'apprends seulement ce que sont les pLists, et je suis un peu flou sur la façon de les implémenter. ..

Où vais-je me tromper ici?

- (IBAction)btnCreateBudget:(id)sender { Budget *budget = [[Budget alloc] init]; budget.name = self.txtFldBudgetName.text; budget.amount = [self.txtFldBudgetAmount.text intValue]; // Write the data to the pList NSMutableArray *anArray = [[NSMutableArray alloc] init]; // I want this to be a global variable for the entire app. Where do I put this? [anArray addObject:budget]; [anArray writeToFile:[self dataFilePath] atomically:YES]; /* As you can see, below is where I test the code. Unfortunately, every time I run this, I get only 1 element in the array. I'm assuming that this is because everytime the button is pressed, I create a brand new NSMutableArray *anArray. I want that to be global for the entire app. */ int i = 0; for (Budget * b in anArray) { i++; } NSLog(@"There are %d items in anArray",i); } -(NSSsortingng *) dataFilePath { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentDirectory = [path objectAtIndex:0]; return [documentDirectory ssortingngByAppendingPathComponent:@"BudgetData.plist"]; } 

edit: Je voudrais append que je crée le tableau anArray afin qu'il puisse être accessible par d'autres vues. Je comprends que cela peut être fait avec NSNotification? ou Dois-je le faire les classs appDelegate? L'objective final est de faire en sorte que l'object anArray remplisse un UITableView situé dans une vue séparée.

Il suffit de mettre la déclaration en dehors de la méthode au lieu de l'intérieur.

 NSMutableArray *anArray = nil; - (IBAction)btnCreateBudget:(id)sender { ... if ( anArray == nil ) anArray = [[NSMutableArray alloc] init]; ... } 

Si c'est seulement utilisé à l'intérieur du file, faites-le "statique" à la place pour empêcher les collisions de noms avec d'autres files:

  static NSMutableArray *anArray = nil; 

Si c'est seulement utilisé à l'intérieur de la méthode one, faites-le "static" et placez-le dans cette méthode:

 - (IBAction)btnCreateBudget:(id)sender { static NSMutableArray *anArray = nil; ... if ( anArray == nil ) anArray = [[NSMutableArray alloc] init]; ... } 

Notez que les gens utilisent généralement une sorte de convention de nommage pour les variables globales, comme "gArray", pour les différencier facilement des variables locales, des variables d'instance ou des parameters de méthode.

La variable globale n'est pas nécessaire dans ce cas. Vous pouvez faire quelque chose comme ceci:

  1. Lit les anciennes données dans un tableau mutable ( initWithContentsOfFile: .
  2. Ajouter un nouvel logging au tableau.
  3. Enregistrez le tableau dans le même file.

Mais le second problème dans votre code est que si votre class Budget n'est pas un type de list de propriétés (objects NSSsortingng, NSData, NSArray ou NSDictionary) writeToFile: ne l'savea pas avec succès.

Vous devez vous assurer que votre class Budget appelle NSCoder , puis les NSCoder initWithCoder: et NSCoder decodeWithCoder: Sinon, writeToFile: ne fonctionnera pas pour votre class NSObject .

Mais je m'égare. La réponse à la question initiale devrait être la suivante.

Dans votre file .h , vous devez effectuer les opérations suivantes.

 @interface WhateverClassName : UIViewController { NSMutableArray *anArray; } @property(nonatomic, retain) NSMutableArray *anArray; @end 

Ensuite, vous devez vous assurer que vous @synthesize le NSMutableArray sorte que vous n'obtenez pas d'avertissements bizarres. Ceci est fait juste après la ligne @implementation dans votre file .m .

Ensuite, dans la fonction que vous souhaitez affecter à la memory, procédez comme suit.

 anArray = [[NSMutableArray alloc] initWithObjects:nil]; 

C'est maintenant une variable global . Il est global dans le sens où il peut être utilisé à partir de n'importe quelle fonction et n'est pas limité à une utilisation dans une fonction.

Si vous souhaitez que datatables soient accessibles à l'set de l'application ou du context ("global"), vous pouvez utiliser un singleton. Cependant, faites-le avec soin et assurez-vous qu'il est réellement nécessaire et approprié. Je suggère de faire beaucoup de lecture avant la mise en œuvre d'un singleton. Carter Allen a une bonne implémentation de base ici .

Selon "L'objective final est de faire en sorte que l'object anArray remplisse une vue UITableView dans une vue séparée", vous n'avez pas besoin d'écrire quoi que ce soit dans un file, une database ou un singleton. Il suffit de définir l'object. Comme l'a déclaré Sébastien Peek.

Si vous souhaitez stocker des données hors connection, searchz sqlite, json, plist, etc