NSXMLParser Problem IBOutlet Speicher: 0x0

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSXMLParser Problem IBOutlet Speicher: 0x0

    Hallo,
    nachdem mit XPath garnix geklappt hat, bin ich auf NSXMLParser umgestiegen und bin sehr zufrieden. Entgegen aller Vermutungen (da ich hier schon so viel negatives darüber gelesen habe) hat er das File anstandslos geparst und mir in ein Array "gesteckt".

    Aber dennoch gibt es ein Problem :(

    Ich habe ein Outlet, vom AppController in meiner Klasse. ( Ich habe den Pars-Prozess in eine eigene Klasse "gesteckt" wegen der Übersicht. )

    Jetzt will ich das Array durch das Outlet an die AppController Klasse weitergeben, denn dort befindet sich das eigentlich Array mit den Daten ( das aus dem die Funktion die etwas brauchen es auslesen).

    Allerdings scheint meine "Parsklasse" keinen Kontakt mehr zu dem Outlet bzw. der AppController Klasse zu haben. Das Array wird "lokal" gut erstellt, aber leider kann es nicht mehr zum AppController übergeben werden.

    Ist das eine Nebenwirkung vom NSXMLParser oder habe ich nur etwas übersehen?

    Hier ist mein Code:

    (Das ObstaclesArray ist das Array das durch den Parse Prozess gefüllt wurde )

    Quellcode

    1. @implementation TGParkParser
    2. - (void)parseXMLFile:(NSString *)pathToFile {
    3. NSLog(@"Activated parseXMLFile:");
    4. if(parkParser){
    5. [parkParser release];
    6. }
    7. parkParser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathToFile]];
    8. obstaclesArray = [[NSMutableArray alloc]init];
    9. [parkParser setDelegate:self];
    10. [parkParser setShouldResolveExternalEntities:NO];
    11. [parkParser setShouldReportNamespacePrefixes:NO];
    12. NSLog(@"Park parser is parsing...");
    13. [parkParser parse];
    14. [parkParser release];
    15. NSLog(@"Finished parsing :)");
    16. int i;
    17. for(i=0;i<[obstaclesArray count];i++){
    18. [AppControllerOutlet insertObject:[self objectInObstaclesArrayAtIndex:i] inObstaclesArrayAtIndex:i];
    19. }
    20. }
    21. ...
    Alles anzeigen


    viele Grüße
    Quedepi
  • Das Array wird in den Delegate Methoden der NSXMLParser Klasse gefüllt, und sogar im Debug Modus zeigt es an, das das Array nach und nach gefüllt wird.

    Quellcode

    1. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    2. //NSLog(@"Did startElement: %@",elementName);
    3. if([elementName isNotEqualTo:@"obstacles"] && [elementName isNotEqualTo:@"park"])
    4. {
    5. NSLog(@"Did start element: %@",elementName);
    6. currentObstacle = [[TGObstacle alloc]init];
    7. NSLog(@"New obstacle alloced");
    8. NSString* readX = [attributeDict objectForKey:@"x"];
    9. NSString* readY = [attributeDict objectForKey:@"y"];
    10. // ...
    11. [currentObstacle setX:[readX intValue]];
    12. [currentObstacle setY:[readY intValue]];
    13. // ...
    Alles anzeigen


    Quellcode

    1. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    2. if([elementName isEqualTo:@"park"] || [elementName isEqualTo:@"obstacles"]){return;}
    3. if([elementName isNotEqualTo:@"obstacles"] && [elementName isNotEqualTo:@"park"])
    4. {
    5. NSLog(@"Did end element: %@",elementName);
    6. if(currentObstacle != nil){
    7. [self insertObject:currentObstacle inObstaclesArrayAtIndex:[self countOfObstaclesArray]];
    8. [currentObstacle release];
    9. }
    10. }
    11. }
    Alles anzeigen

    Das doofe ist, das es garnicht mehr auf Reaktionen mit dem Outlet reagiert, auch nicht mit Test Methoden wie -(void)sayHello, die ien NSLog ausgeben...

    Hier mal das Outlet:

    Quellcode

    1. IBOutlet appController* appControllerOutlet;

    geht auch ned so:

    Quellcode

    1. IBOutlet id appControllerOutlet;



    viele Grüße
  • Hab was neues gefunden:

    Im Debug zeigt das appController IBOutlet 0x0 als Speicherbelegung an :(
    Hab schon danach gegoogelt, dann gecleaned und build Ordner gelöscht, aber es hilft nichts... Bei allen anderen Klassen meines Projekts ist es nicht 0x0... nur bei dieser Klasse...
  • was meinst du mit nicht initialisiert?

    Im InterfaceBuilder ist es verbunden wie immer, und auch sonst ist der Aufbau der selbe den ich sonst immer verwende...

    also

    myClass.h

    Quellcode

    1. IBOutlet AppController* myAppController


    und

    myClass.m

    Quellcode

    1. [myAppController doSomething:@"something"];


    z.B.
    ...
  • Original von quedepi
    was meinst du mit nicht initialisiert?

    Nicht verbunden mit einer Instanz.

    Original von quedepi
    Im InterfaceBuilder ist es verbunden wie immer

    Mag sein, dass Du da im Nib was verbunden hast, aber sicher nicht das Outlet, auf das Du in parseXMLFile: zugreifst. Sonst wäre das nicht 0x0.

    Original von quedepi
    myClass.h

    Quellcode

    1. IBOutlet AppController* myAppController

    Noch ein Name für das Outlet. Also ich steig da nicht mehr durch, Du?

    Michael
  • mist, ich finde den Fehler einfach nicht, obwohl ich alles durchgecheckt habe was ihr vorgeschlagen habt. Ich hab jetzt mal auf einen NSArrayController zurückgegriffen, auber auch dessen Outlet kann nicht angesprochen werden -.-

    Ich hab mal das File angehängt... vielleicht seht ihr den Fehler eher als ich.
    Xcode 2.5
    Wenn sich jemand wundert... mir ist da auch noch was mit einem Lokalisierungstest kaputt gegangen....
    Ich glaub ich fang des Projekt nochmal neu an und entwerfe erstmal alles neu aufm Papier...
    Wär trotzdem cool wenns sich mal jemand anschaut^^

    Geparst wird, wenn ihr die Datei die dabei ist öffnen wollt^^

    >49kB
    File-Upload.net Downloadlink
  • Original von quedepi
    Ich glaub ich fang des Projekt nochmal neu an und entwerfe erstmal alles neu aufm Papier...

    Gute Idee. Das Projekt ist ja grausam. Dringende Empfehlung: halte Dich an die Namenskonventionen. Du hast in Deinem Projekt zum Beispiel eine Klasse „parkView“ und auch eine Instanzvariable „parkView“. Folge: der Compiler wirft mit Warnungen nur so um sich, weil er nicht mehr prüfen kann, ob jetzt eine Klassen- oder Instanzmethode gemeint ist. Das trägt nicht zur Übersicht bei und kann nur im Chaos enden.

    Zum Outlet-Problem: Du machst genau das, worauf Amin hingewiesen hat. In MyDocument.m Zeile 94:

    Quellcode

    1. TGParkParser* theParkParser = [[TGParkParser alloc]init];
    Das ist eine neue Instanz. Die hat mit der Instanz im Nib, wo Du das Outlet verbunden hast, nichts zu tun.

    Michael