2012-04-05 3 views
0

Iam erhalte eine EXC_BAD_ACCESS die ganze Zeit und ich kann nicht herausfinden, warum ...Objective-C Anfänger: Getter Setter prob und EXC_BAD_ACCESS Fehler

einfache Aufgabe:

Der Parser Klasse pases XML mit TouchXML in ein NSMutableArray namens listArray. In der Methode grabCountry kann ich auf die Funktionen listArray und listArray.count zugreifen, die gut funktionieren.

Jetzt brauche ich die listArray.count in einer anderen Klasse der MasterViewController. Aber ich bekomme einen EXC_BAD_ACCESS Fehler die ganze Zeit. Bitte helfen! Hier

ist der Code snipplet: parser.h

#import <Foundation/Foundation.h> 

@interface Parser : NSObject 

@property (strong, retain) NSMutableArray *listArray; 
@property (strong, retain) NSURL *url; 

-(void) grabCountry:(NSString *)xmlPath; 
@end 

Parser.m

#import "Parser.h" 
#import "TouchXML.h" 

@implementation Parser 
@synthesize listArray; 
@synthesize url; 

-(void) grabCountry:(NSString *)xmlPath { 

    // Initialize the List MutableArray that we declared in the header 
    listArray = [[NSMutableArray alloc] init]; 

    // Convert the supplied URL string into a usable URL object 
    url = [NSURL URLWithString: xmlPath]; 

    //XML stuff deleted 

    // Add the blogItem to the global blogEntries Array so that the view can access it. 
    [listArray addObject:[xmlItem copy]]; 

    //works fine 
    NSLog(@"Amount: %i",listArray.count); 
} 

@end 

MasterViewController.h

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 
#import "TouchXML.h" 
#import "Parser.h" 

@class Parser; 

    @interface MasterViewController : UITableViewController{ 

    Parser *theParser; 

} 
@end 

MasterViewControlelr.m

- (void)viewDidLoad 
{ 
NSString *xmlPath = @"http://url/to/xml.xml"; 

theParser = [[Parser alloc] init]; 
//Starts the parser 
[theParser grabCountry:xmlPath]; 

//Here I want to access the Array count, but getting an BAD ACCESS error 
NSLog(@"Amount %@",[theParser.listArray count]); 

[super viewDidLoad]; 
} 

Kann mir jemand erklären, was das Problem hier ist? Danke!

Antwort

1

Intern hat jede @property eine entsprechende Instanzvariable.

In Ihrer -grabCountry Methode, Sie sind das Instanz-Variable in der Anweisung listArray = [[NSMutableArray alloc] init]; (gleiche mit url = [NSURL URLWithString: xmlPath];) direkt zugreifen, statt dem @property ‚Setter-Methode s, wodurch die NSMutableArray, die Sie alloc-init‘ d nicht durch die Eigenschaft beibehalten werden . Um die @property ‚s Setter-Methode aufrufen, sollten Sie

NSMutableArray *temp = [[NSMutableArray alloc] init]; 
self.listArray = temp; // or [self setListArray:temp]; 
[temp release]; 

rufen Wenn Sie Xcode haben zeigen einen Fehler, wenn Sie direkt auf die Instanzvariable eines @property zugreifen, können Sie @synthesize listArray = _listArray haben, was ändert den Namen die Instanzvariable _listArray.

Wenn es einen alloc-init gibt, muss im Allgemeinen ein entsprechender release vorliegen (außer bei Verwendung der automatischen Referenzzählung).


Auch in der [listArray addObject:[xmlItem copy]]; Anweisung, wird der Anruf an copy nicht erforderlich, da NSArray s jedes Objekt behalten, die ihnen zugefügt wird. Das Aufrufen von copy erhöht auch die Retain-Anzahl, was ein weiteres Leck ist. Stattdessen sollten Sie haben nur [self.listArray addObject:xmlItem];


Sie EXC_BAD_ACCESS bekommen, weil in NSLog(@"Amount %@",[theParser.listArray count]);, werden Sie %@ Formatbezeichner verwenden, die für NSString s ist. Sie möchten die Zählung des Arrays, eine Ganzzahl, drucken, also sollten Sie %d oder %i verwenden.

+0

Danke für die Antwort.Ich änderte alles und es klingt für mich plausibel :) Aber ich bekomme den gleichen Fehler, wenn ich versuche, darauf zuzugreifen: [theParser.listArray count] (aus der MasterViewController-Klasse) – Nico

+0

Schließlich fing das Problem ... Sie verwenden '% @ 'wenn Sie die Zählung (eine Ganzzahl) drucken, wenn Sie'% d' oder '% i' verwenden sollten. Ich werde normalerweise auch davon erwischt. =) Ich habe meine Antwort bearbeitet, um dies zu reflektieren. – neilvillareal

+0

% Ich arbeite ... Kopieren & Einfügen Fehler: -/Sie haben meinen Tag gemacht! – Nico