//

Het probleem van de veranderende NSString

Het probleem van de veranderende NSString discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) Ik heb een xml met deze opbouw: <category name="Carhifi"> <subcat code="AC-ACCESS">Accesoires</subcat> <subcat code="AC-HEADUN">Autoradio</subcat> <subcat code="AC-NAVIGA">Portable Navigatie</subcat> </category> Dan heb ik een object filteritem met een ...



Ga terug   iPhone, iPod touch, iPad en Apple TV forum > Development > Ontwikkelen voor iOS
Wachtwoord vergeten? Registreren!
Registreer FAQ Ledenlijst Kalender Berichten van vandaag

Reageren

 

Discussietools Weergave
  #1  
Oud 17-12-10, 11:47
Nikooos's schermafbeelding
Nikooos Nikooos is offline
• iOS 10.0.2
• 10.0.2
• Besturingssysteem: Mac OS X
 
Geregistreerd: Nov 2007
Locatie: Tilburg
Berichten: 3.172
Standaard Het probleem van de veranderende NSString

Ik heb een xml met deze opbouw:
<category name="Carhifi">
<subcat code="AC-ACCESS">Accesoires</subcat>
<subcat code="AC-HEADUN">Autoradio</subcat>
<subcat code="AC-NAVIGA">Portable Navigatie</subcat>
</category>

Dan heb ik een object filteritem met een string en een mutable array:
@interface FilterItem : NSObject {
NSString *categorie;
NSMutableArray *subcat;
}

Via een xmlcontroller (nsxmlparser) vul ik die string en array. Maar als ik die later wil uitlezen, dan is op een of andere vage reden (af en toe) het laatste object in de array veranderd van een nsstring naar een calayer. Dit zorgt voor een crash als ik dit wil uitputten als string.

Heel begrijpelijk dat hij crash, maar waarom het opeens geen string meer is??

Iemand een ideetje die me op de goede weg kan helpen?

XMLFilterController.h
Code:
#import <Foundation/Foundation.h>
@class FilterItem;

@interface XMLFilterController: NSObject <NSXMLParserDelegate> {
    NSMutableString *currentNodeContent;
    NSMutableArray *items;
    NSXMLParser *parser;
    FilterItem *currentItem;
    
    int counter;
    NSMutableArray *subcats;
    NSString *attribuut;
}

@property (readonly,retain) NSMutableArray *items;

- (id)loadXMLByURL:(NSString *)urlString;
- (id)loadXMLByFile:(NSString *)file;

@end
XMLFilterController.m
Code:
#import "XMLFilterController.h"
#import "FilterItem.h"

@implementation XMLFilterController

@synthesize items;

- (id)loadXMLByURL:(NSString *)urlString {
    //NSLog(@"parsen!");
    
    items = [[NSMutableArray alloc] init];
    currentItem = [FilterItem alloc];
    currentItem.categorie = @"<kies filter>";
    [items addObject:currentItem];
    
    
    NSURL *url = [NSURL URLWithString: urlString];
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    parser.delegate = self;
    [parser parse];
    [parser release];
    
    currentItem = nil;
    
    return self;
}

- (id)loadXMLByFile:(NSString *)file {
    //NSLog(@"loadXMLByFile");
    items = [[NSMutableArray alloc] init];
    //NSURL *url = [NSURL URLWithString: urlString];
    //parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    parser = [[NSXMLParser alloc] initWithData:[NSData  dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file  ofType:@"XML"]]];
    parser.delegate = self;
    [parser parse];
    [parser release];
    currentItem = nil;    
    
    return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString  *)elementName namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict  {
    if([elementName isEqualToString:@"category"]){
        //NSLog(@"item found!");
        currentItem = [FilterItem alloc];
        currentNodeContent = [[NSMutableString alloc] init];
        //NSLog(@"attribuut: %@",[attributeDict objectForKey:@"name"]);
        attribuut = [attributeDict objectForKey:@"name"];
        
        currentItem.categorie = attribuut;
        counter = 1;
        subcats = [[NSMutableArray alloc] init];
        //NSLog(@"%@",subcats);
        [subcats addObject:@"<kies filter>"];
    } else if ([elementName isEqualToString:@"subcat"]) {
        //NSLog(@"Een van deze ook gevonden!");
        currentNodeContent = [NSMutableString string];
    }
    
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString  *)elementName namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qName {    
    if ([elementName isEqualToString:@"category"]) {
        if (currentItem == nil) {
            
        } else {
            currentItem.subcat = subcats;
            NSLog(@"%@",subcats);
            
            [currentNodeContent release];
            currentNodeContent = nil;
            
            [items addObject:currentItem];
            //NSLog(@"%d",[items count]);
            [currentItem release];
            currentItem = nil;
        }
        
    } else if ([elementName isEqualToString:@"subcat"]) {
        
        if ([currentNodeContent isEqualToString:@""]){
            //[subcats addObject:currentNodeContent];
        } else {
            NSString *cat = currentNodeContent;
            [subcats addObject:cat];
            //NSLog(@"subcat: %@",currentNodeContent);
        } 
        
    }
    
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {   
    [currentNodeContent appendString:[string  stringByTrimmingCharactersInSet:[NSCharacterSet  whitespaceAndNewlineCharacterSet]]];
}

- (void)dealloc {
    [currentNodeContent release];
    [items release];
    [super dealloc];
}

@end
FilterItem.h
Code:
#import <Foundation/Foundation.h>


@interface FilterItem : NSObject {
    NSString *categorie;
    NSMutableArray *subcat;

}

@property (retain, nonatomic) NSString *categorie;
@property (retain, nonatomic) NSMutableArray *subcat;


@end
FilterItem.m
Code:
#import "FilterItem.h"


@implementation FilterItem

@synthesize categorie;
@synthesize subcat;


- (void)dealloc {
    [super dealloc];
}

@end
Dan uiteindelijk vul ik een array met die object door deze funtie aan te roepen:
filterArray = [[xmlcontr1 loadXMLByURL:url1] items];

en vul ik mijn array met subcategorieen
subArray = [[filterArray objectAtIndex:selectedCat] subcat];

Als ik die subarray wil outputten, dan gaat het mis.
Advertentie
Advertentie Gesponsorde links (verdwijnt na registratie)

  #2  
Oud 17-12-10, 11:56
Whacko Whacko is offline
• iOS 7.1.2
• 5.1.1
• Besturingssysteem: Mac OS X
 
Geregistreerd: Jan 2009
Berichten: 484
Standaard

currentNodeContent = [NSMutableString string];

die een retain geven, of autorelease zetten. Je releaset hem namelijk zelf in DidEndElement.
__________________
Software Engineer
iPhone Developer
  #3  
Oud 17-12-10, 12:17
Nikooos's schermafbeelding
Nikooos Nikooos is offline
• iOS 10.0.2
• 10.0.2
• Besturingssysteem: Mac OS X
 
Geregistreerd: Nov 2007
Locatie: Tilburg
Berichten: 3.172
Standaard

Whacko held!!! Dat was dé oplossing!!!

Echt, anderhalve dag aan het zoeken geweest en daar had ik simpelweg niet aan gedacht. Wie had gedacht dat het zo simpel kon zijn. Ik zat me echt blind te staren..
  #4  
Oud 17-12-10, 12:23
Whacko Whacko is offline
• iOS 7.1.2
• 5.1.1
• Besturingssysteem: Mac OS X
 
Geregistreerd: Jan 2009
Berichten: 484
Standaard

You are welcome
  #5  
Oud 17-12-10, 16:05
wubbe wubbe is offline
• iOS 5.0
• 5.1
• Besturingssysteem: Mac OS X
 
Geregistreerd: Oct 2008
Locatie: Haarlem
Berichten: 348
Standaard

Volgens mij had je hier op de volgende manier achter kunnen komen:
1) Doe Appeltje-I op je App in 'Executables'
2) Ga naar de tab 'Arguments'
3) Voeg onderin toe: NSZombieEnabled en NSDebugEnabled, beide met value 'YES'
4) Als je vage resultaten krijgt zet je het vinkje voor deze twee aan en draai je je Applicatie nog een keer.

Als je nu een al gereleased object benaderd krijg je een foutmelding: "Message sent to deallocated instance."
__________________
Leon
[iPhone- en Java ontwikkelaar]
  #6  
Oud 18-12-10, 13:59
Nikooos's schermafbeelding
Nikooos Nikooos is offline
• iOS 10.0.2
• 10.0.2
• Besturingssysteem: Mac OS X
 
Geregistreerd: Nov 2007
Locatie: Tilburg
Berichten: 3.172
Standaard

Bedankt voor de tip Wubbe. Ik zal het eens proberen van de week.
  #7  
Oud 20-12-10, 10:11
wubbe wubbe is offline
• iOS 5.0
• 5.1
• Besturingssysteem: Mac OS X
 
Geregistreerd: Oct 2008
Locatie: Haarlem
Berichten: 348
Standaard

Let wel op dat je het vinkje bij 'gewoon' werken weer uit zet. De grap is dat iedere nil-pointer wijst naar zo'n Zombie object. Dat betekent wel dat:

Code:
if (!object) {
    object = [[Object alloc] init];
}
Niet meer werkt. if (object) is dan namelijk altijd TRUE.
Reageren



Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten)

 

Soortgelijke discussies

Discussie Auteur Forum Reacties Laatste bericht
iPhone: Probleem met het Jailbreak'n van mijn 3g Dupp Jailbreak 5 15-03-11 18:23
Last van het antenne probleem. Oplossing? iDavid iPhone algemeen 9 02-10-10 23:25
Probleem met het ontvangen van sms w d Unlock [archief] 4 10-06-08 16:53

Regels voor berichten
Je mag geen nieuwe discussies starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit
Trackbacks are Aan
Pingbacks are Aan
Refbacks are Uit



Alle tijden zijn GMT +2. Het is nu 14:21.