2011-08-22 4 views
1

J'ai le code suivant dans un programme Cocoa. Dans ce code, theList est un pointeur vers un objet NSMUtableArray et l'entrée est un pointeur NSTextField.Question de collecte des ordures dans Cocoa

-(IBaction)addItem:(id)sender 
{ 
    NSString *item = [input stringValue]; 
    [theList addObject:item]; 
    . . . 
} 

Lors de l'exécution du programme et cette méthode est appelée, je reçois une violation d'accès sur la ligne [theList addObject:item]. En dernier recours, j'ai activé la récupération de place et le code fonctionne sans aucun problème. Je ne comprends pas pourquoi ça ne marche pas sans le garbage collector. Quelqu'un peut-il expliquer? Merci

Répondre

2

Vous n'avez probablement pas initialisé votre tableau correctement. Il est fréquent de voir des gens Ivars avec des objets d'initialisation autoreleased:

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     array = [NSMutableArray array]; 
    } 
    return self; 
} 

Cela ne fonctionnera pas. Lorsque votre méthode est appelée, personne ne garantit que le tableau existe toujours. Allumer le garbage collector va laisser la tâche de gestion de la mémoire avec elle, qui comprend que vous souhaitez utiliser le tableau plus tard et gère correctement.

En vertu des règles de gestion de la mémoire traditionnelle, utilisez quelque chose comme ceci:

array = [[NSMutableArray alloc] init]; 

S'il vous plaît envoyer votre code, où le tableau est initialisé.