2009-04-25 8 views
1

Cela fait longtemps que je n'ai pas fait de programmation. Utilisé pour être 'ok' à la lecture C & C++ ... n'a jamais beaucoup écrit.Objectif fondamental-C question ... me rendre fou

J'ai une classe extrêmement simple que je veux utiliser pour manipuler le contenu d'un tableau (en utilisant NSMutableArray). Le tableau doit persister en tant qu'objet afin que je puisse y effectuer plusieurs mises à jour pendant une seule exécution de mon programme (ne pas s'inquiéter du stockage des données d'état sur le disque)

Voici mon problème. Je ne suis pas clair sur où/quand je devrais Alloc/Init mon objet Array de sorte qu'il sera dans un état utilisable chaque fois qu'un bouton est cliqué sur la vue de mon iPhone. J'essaie de créer une sous-classe ViewController qui inclut un tableau en tant que variable d'instance, qui peut ensuite être référencée dans le code qui répond aux clics de bouton de la vue. J'ai essayé 3 approches

  1. J'ai essayé de simplement référencer la variable d'instance de tableau dans une méthode que j'ai écrite dans le cadre de la même classe. Aucun Alloc/Init n'importe où dans cette version du code. Lorsque j'appelle la fonction addObject, elle semble échouer car l'objet tableau n'a pas été alloué/initialisé.

  2. J'ai également essayé d'Alloc/Init une instance de mon objet de tableau dans la méthode viewWillDisplay. Le compilateur Xcode se plaint que mon nouvel objet alloué n'est jamais utilisé. Pour les coups de pied, j'ai fait un alloc/init dans le cadre de la méthode 'bouton clic' que j'écris ... mais bien sûr cela alloue une nouvelle instance chaque fois que je clique sur mon bouton.

Voici ce que j'ai dans les .h et .m fichiers pour mon exemple (ce scénario montre 1)

apprécierais vraiment si quelqu'un pourrait remplir le vide GIANT j'ai évidemment eu dans ma compréhension de la façon dont les objets Instance Variable sont supposés être utilisés. (Je l'ai lu une grande variété de pommes docs sur Obj-C..etc aussi googlé mon cerveau en essayant de trouver une explication

Le .h:..

#import <UIKit/UIKit.h> 

@interface ArrayManagerViewController : UIViewController { 
    NSMutableArray *buttonArray; 
} 
- (IBAction)buttonClicked:(id)sender; 

@end 

Et le .m

#import "ArrayManagerViewController.h" 

@implementation ArrayManagerViewController 

- (IBAction) buttonClicked:(id)sender { 
    NSString *senderTitle = [sender currentTitle]; 
    int intSenderTitle = [senderTitle intValue]; 
    [buttonArray insertObject:[NSString stringWithFormat:@"%d", 
                 intSenderTitle] 
         atIndex:intSenderTitle]; 

    for (id obj in buttonArray) 
     NSLog(@"Object Value %@", obj); 
} 
+0

Je ne comprends pas votre question. Voulez-vous savoir comment créer un tableau global ou un singleton? –

Répondre

1

d'accord, Objective C peut être un peu gênant parce que vous avez deux types de syntaxe, C et Smalltalk. vous devez créer votre tableau avec quelque chose de code comme

buttonArray = [[NSMutableArray alloc] init] ; 

Il y a un joli tutoriel léger here.

3

Si votre baie est utilisée pendant toute la durée de vie de votre ViewController, vous pouvez probablement allouer/initer le tableau dans la méthode init (override) ArrayManagerViewController et appeler la libération dans un override dealloc.

@implementation ArrayManagerViewController 

- (ArrayManagerViewController *) init 
{ 
    if (self = [super init]) 
    { 
     [[buttonArray alloc] init]; 
    } 

    // handle errors... 

    return self; 
} 

- (void)dealloc 
{ 
    [buttonArray release]; 
    [super dealloc]; 
} 

// other methods 

@end 
+0

Je pense que le hellra1ser est plus correct, un ViewController a généralement une version plus spécifique de "init" que ce que j'ai ci-dessus. Je voulais juste donner une idée générale de la façon de faire cela. –

1

Vous devez savoir que vous devez vous initialiser la variable d'instance dans le constructeur

un message

qui initialisent UIViewController est (en général)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

afin que votre mise en œuvre sera

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
     buttonArray = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

et n'oubliez pas de libérer vos boutonsArray dans le message dealloc

- (void) dealloc { 
    [buttonsArray release]; 
    [super dealloc]; 
} 

P.S.:just lire et bases ObjC gestion de la mémoire sur Cocoa developer.apple.com avant de commencer à écrire le code

+0

Votre réponse est exacte, il existe une version plus spécifique d'init que ce que j'ai. –