2010-08-02 42 views
2

Cela me tourne vraiment la tête ... J'essaie d'accéder à un NSMutableArray dans un IBAction que j'ai défini dans viewDidLoad. Malheureusement, je continue d'obtenir un EXC_BAD_ACCESS. Je suis nouveau à tout cela donc j'apprécierais vraiment un aperçu de ce que je fais mal.SDK iPhone: nombre de NSMutableArray provoque EXC_BAD_ACCESS

Vous trouverez ci-dessous les extraits de code correspondants.

CounterViewController.h:

@interface CounterViewController : UIViewController{ 
NSMutableArray *countHistoryArray; 
} 
@property(nonatomic, retain) NSMutableArray *countHistoryArray; 

CounterViewController.m:

@implementation CounterViewController 
@synthesize countHistoryArray; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

//Fill array with some dummy data 
self.countHistoryArray = [[NSMutableArray alloc] init]; 
NSDate *now = [[[NSDate alloc] init] autorelease]; 
CurrentCount *historicCount = [[[CurrentCount alloc] 
     initWithCount:[NSNumber numberWithInteger:22] 
     description:@"Testcount" 
     dateAndTime:now] autorelease]; 

[self.countHistoryArray addObject: historicCount]; 

//Do some logging - everything is working fine here! 
NSLog(@"%@", [self.countHistoryArray description]); 

} 


//Later on we click on a button and want to use the array 
- (IBAction)doSomeStuff { 
    //Let's look at the array again - and now it crashes with EXC_BAD_ACCESS 
NSLog(@"%@", [self.countHistoryArray description]); 
} 

Merci beaucoup!
Manuel


EDIT code supplémentaire comme demandé par @jamapag

CurrentCount.h

#import <Foundation/Foundation.h> 


@interface CurrentCount : NSObject { 
    NSNumber *counterLevel; 
    NSString *description; 
    NSDate *dateAndTime; 
} 

- (id)initWithCount:(NSNumber *)newCounterLevel description:(NSString *)newDescription dateAndTime:(NSDate *)newDateAndTime; 

@property(nonatomic, copy) NSNumber *counterLevel; 
@property(nonatomic, copy) NSString *description; 
@property(nonatomic, copy) NSDate *dateAndTime; 

@end 

CurrentCount.m

#import "CurrentCount.h" 


@implementation CurrentCount 
@synthesize counterLevel; 
@synthesize description; 
@synthesize dateAndTime; 

- (id)initWithCount:(NSNumber *)newCounterLevel description:(NSString *)newDescription dateAndTime:(NSDate *)newDateAndTime{ 
    self = [super init]; 
    if(nil != self){ 
     self.counterLevel = newCounterLevel; 
     self.description = newDescription; 
     self.dateAndTime = newDateAndTime; 
    } 
    return self; 
} 


-(void) dealloc{ 
    self.counterLevel = nil; 
    self.description = nil; 
    self.dateAndTime = nil; 
    [super dealloc]; 
} 

@end 
+0

Je pense que le problème est ailleurs, quelque part entre les deux appels. Cependant, ce code a une fuite à 'self.countHistoryArray = [[NSMutableArray alloc] init]' - vous 'alloc' le tableau, l'accesseur de propriété' retain', mais vous ne libérez pas. Vous devez soit affecter directement à l'ivar, soit ajouter une autorelease. Il vaut probablement la peine de vérifier d'autres utilisations douteuses de 'self.countHistoryArray = ...' qui pourrait causer le problème. – walkytalky

+0

Je fais '- (void) dealloc {[release self.countHistoryArray];}' que je pense faire le travail. Ai-je tort? – sprain

+0

Dans '-dealloc', vous devriez appeler' -release' sur l'ivar lui-même: '[countHistoryArray release]', ou vous devez définir la propriété sur nil, ce qui libèrera tout ce qui était précédemment stocké dans l'ivar, ayant exactement le même effet: 'self.countHistoryArray = nil'. Je préfère la deuxième technique personnellement. –

Répondre

10

Etes-vous sûr que votre code ressemble vraiment comme ça?

- (IBAction)doSomeStuff { 
    //Let's look at the array again - and now it crashes with EXC_BAD_ACCESS 
    NSLog(@"%@", [self.countHistoryArray description]); 
} 

Votre titre de la question dit « nombre NSMutableArray provoque EXC_BAD_ACCESS » - si cette ligne de code dit en fait NSLog(@"%@", [self.countHistoryArray count]);, vous aurez certainement un accident, car NSLog va tenter de traiter un type primitif (le type retourné par -[NSArray count]) en tant qu'objet. Pour utiliser -[NSArray count] dans NSLog, utilisez %u au lieu de %@:

- (IBAction)doSomeStuff { 
    // This time it should work! 
    NSLog(@"Array Count = %u", [self.countHistoryArray count]); 
} 
+0

Ha! Très bien, ça marche! Je vous remercie! (J'ai changé de compte à description quelque part pendant le temps). Ce que je ne comprends pas, c'est que 'NSLog (@"% @ ", [self.countHistoryArray description]) fonctionne maintenant aussi. Vous dites que ça ne peut pas marcher, mais c'est le cas. Des choses étranges ... – sprain

+0

'NSLog (@"% @ ", [self.countHistoryArray description])' fonctionnera - ma formulation a pu être légèrement ambiguë. Dans une chaîne de format style NSLog, vous devez utiliser '% @' pour tout objet Obj-C et un symbole de format approprié pour toutes les primitives C ('% u' pour les ints non signés,'% f' pour les flottants, etc.). En outre, vous pouvez simplement utiliser 'NSLog (@"% @ ", self.countHistoryArray)', puisque 'NSLog' appellera' description' sur l'objet pour vous automatiquement. –

+0

La raison pour laquelle j'ai pensé que cela pourrait être le cas est parce que c'est une erreur commune, que j'ai faite plusieurs fois quand j'apprenais Obj-C (et parfois quand je suis assez fatigué). –

0

Retirez AutoRelease de:

currentCount *historicCount = [[[CurrentCount alloc] initWithCount:[NSNumber numberWithInteger:22] description:@"Testcount" dateAndTime:now] autorelease];

+0

Merci, mais ... j'ai essayé cela avant - et maintenant encore. Toujours la même erreur malheureusement. – sprain

+1

Non, le 'autorelease' est bien, ne plaisante pas avec ça. – walkytalky

+0

@walkytalky Merci, c'est ce que je pensais aussi. Mais je dois penser mal quelque part, donc ça valait le coup d'essayer :) – sprain

0

On dirait que vous publiez accidentellement quelque part countHistoryArray. Essayez de supprimer tous les appels, sauf pour les deux que vous avez montré. En outre, vous pouvez essayer d'activer le zombies pour résoudre le problème. Oh, et en passant, vous ne voulez probablement pas vraiment une propriété publique NSMutableArray et si vous le souhaitez, vous voulez probablement qu'il soit copié, pas conservé. Sinon, l'encapsulation tombe un peu dans les égouts.

+0

Merci! Le premier problème est résolu. Je vais regarder dans la chose copier/conserver. – sprain

0

Je sais que cette question a déjà été résolue et acceptée mais c'est pour les autres qui sont ou qui seront confrontés à ce problème.

Je faisais face au même problème, j'ai essayé toutes les solutions mais aucune solution n'a fonctionné pour moi. Le projet sur lequel je travaille est NON-ARC.

J'ai essayé et fait un simple changement dans la propriété

Auparavant ma propriété pour NSMutableArray était

@property (nonatomic, assign) NSMutableArray * dataArray; 

je l'ai changé:

@property (nonatomic, retain) NSMutableArray * dataArray; 

changé de ASSIGN à RETENIR

Et il a résolu mon problème