2010-09-25 3 views
0

Lorsque mon programme accède à la ligne: [userNumSequence addObject: [NSNumber numberWithInteger: sequenceNumber]]; il obtient l'erreur: Signal reçu du programme: "EXC_BAD_ACCESS".Obtention d'une erreur lors de l'ajout d'un numéro NSNumber à un tableau

Tout ce que je veux faire est de stocker un entier dans le tableau.

// JBNumberGeneration.m 

#import "JBNumberGeneration.h" 


@implementation JBNumberGeneration 

- (id) init{ 
    if (self = [super init]){ 
     userNumSequence = [NSMutableArray arrayWithCapacity:0]; 
    } return self; 
} 

-(IBAction)logSequenceNumber:(id)sender{ 
    NSString *titleOfButton = [sender title]; 
    int sequenceNumber = [titleOfButton integerValue]; 
    i=0; 

    [userNumSequence addObject:[NSNumber numberWithInteger: sequenceNumber]]; 

    //int currentNum = [((NSNumber*)[userNumSequence objectAtIndex: i]) integerValue]; 
    //NSLog(@"%i", currentNum); 

    int count = [userNumSequence count]; 
    NSLog(@"Array size: %i", count); 

    i++; 
} 
@end 

// JBNumberGeneration.h 

#import <Cocoa/Cocoa.h> 


@interface JBNumberGeneration : NSObject { 
    IBOutlet NSTextField *displayLabel; 
    int randNum; 
    int level; 
    int i; 
    NSMutableArray* userNumSequence; 
} 

-(IBAction)logSequenceNumber:(id)sender; 
@end 

Répondre

3

EXC_BAD_ACCESS se produit généralement lorsque vous essayez d'accéder à un membre qui a déjà été désallouée. Étant donné que vous appelez [NSMutableArray arrayWithCapacity:] dans votre fonction init, il est peut-être déjà publié au moment où logSequenceNumber:(id)sender est appelée. Essayez d'ajouter @property (nonatomic, retain) NSMutableArray* userNumSequence à votre @interface et @synthesize userNumSequence à votre @implementation. Puis appelez self.userNumSequence = [NSMutableArray arrayWithCapacity:0] dans votre méthode init. Ne pas oublier de le mettre à nil dans dealloc.

EDIT: Aussi, juste pour être clair que les Cocoa memory management normes de nommage sont comme ceci:

  1. Si vous appelez [[Object alloc] initSomehow], ou [object retain] vous êtes responsable de le relâcher (appel init méthodes appellera automatiquement retain).
  2. Si vous appelez des méthodes telles que [Object objectWithSomething:something], celles-ci sont généralement auto-libérées et seront publiées dans le futur. Vous ne devriez jamais supposer qu'ils existent au-delà de la portée dans laquelle ils sont créés. Selon la documentation de Cocoa, la portée inclut la pile d'appels. Si a: appels b: qui appelle c:, et c: renvoie un objet autoreleased, il peut être transmis en toute sécurité jusqu'à a: à utiliser. Au-delà de ça, il est libéré. C'est au moins mon interprétation de l'explication de l'autorelease.

Si vous avez besoin d'utiliser quelque chose pour la durée de vie de votre objet, conservez-le lorsque vous l'avez et libérez-le en dealloc.

+0

Merci pour l'aide, cela a fonctionné parfaitement. – JoeMBlair

+0

Pas de problème. La gestion de la mémoire Objective-C peut être un peu bizarre si vous n'y êtes pas habitué. –

+0

Désolé, vous avez tord. init n'appelle pas automatiquement retain. Alloc a une retenue implicite, pas init. Il est également considéré comme une mauvaise idée d'utiliser les propriétés dans init. C'est bien mieux dans ce cas juste pour allouer et initialiser le tableau dans init. – JeremyP

Questions connexes