Bienvenue sur le forum du blog iPhon.fr
Pensez à poster dans la bonne rubrique, respecter les propos des autres internautes, ne pas utiliser le langage SMS, et enfin, à utiliser la fonction 'Recherche' !
Et... Gardez le sens de l'humour, de la convivialité et de la décontraction. On n'est pas là pour se prendre la tête ! ;-)
Bonjour,
Depuis plusieurs jours je bloque sur une erreur à l'execution de mon application (lecture d'un flux RSS).
la console de log me retourne
010-08-26 17:29:19.033 ADA[376:4703] lecture de : title
2010-08-26 17:29:19.034 ADA[376:4703] chaine trouvée :
2010-08-26 17:29:19.034 ADA[376:4703] chaine trouvée : Kai Williams confirm
2010-08-26 17:29:19.035 ADA[376:4703] title <- Kai Williams confirmé
2010-08-26 17:29:19.036 ADA[376:4703] *** -[rssParser setTitle:]: unrecognized selector sent to instance 0x395d710
J'ai lu sur ce forum que c'est un problème de gestion de mémoire. Mais j'ai beau retourner le problème dans tout les sens je ne vois pas mon erreur. Donc si quelqu'un peut m'aider...
voici mon code
// newsList.h
#import <Foundation/Foundation.h>
@interface NewsList : NSObject { // objet gérant une entrée du flux
NSString * _title,* _description, * _linkUrl, * _guidUrl, * _mediaUrl;
NSDate * _pubDate;
}
@property (nonatomic, copy) NSString * title;
@property (nonatomic, copy) NSString * description;
@property (nonatomic, copy) NSString * linkUrl;
@property (nonatomic, copy) NSString * guidUrl;
@property (nonatomic, copy) NSString * mediaUrl;
@property (nonatomic, retain) NSDate * pubDate;
@end
// newsList.m
#import "NewsList.h"
@implementation NewsList
@synthesize title = _title;
@synthesize description = _description;
@synthesize linkUrl = _linkUrl;
@synthesize guidUrl = _guidUrl;
@synthesize pubDate = _pubDate;
@synthesize mediaUrl = _mediaUrl;
- (void) dealloc{
self.title = nil;
self.description = nil;
self.linkUrl = nil;
self.guidUrl = nil;
self.pubDate = nil;
self.mediaUrl = nil;
[super dealloc];
}
@end
// rssparser.h
#import <Foundation/Foundation.h>
@class NewsList;
@protocol rssParserDelegate;
@interface rssParser : NSObject {
NewsList * _currentItem; // référence à notre liste de news
NSMutableString * _currentItemValue;
NSMutableArray * _rssItems; // pointeur temporaire qui permet d'ajouter des élements dans la table qui sera affichée
id<rssParserDelegate> _delegate;
NSOperationQueue * _retrieverQueue;
}
@property(nonatomic, retain) NewsList * currentItem;
@property(nonatomic, retain) NSMutableString * currentItemValue;
@property(readonly) NSMutableArray * rssItems;
@property(nonatomic, assign) id<rssParserDelegate> delegate;
@property(nonatomic,retain) NSOperationQueue * retrieverQueue;
//rssparser.m
//
// rssparser.m
// ADA
//
// Created by Richard Pichet on 18/08/10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "rssparser.h"
#import "NewsList.h"
@implementation rssParser
@synthesize currentItem = _currentItem; // stock toutes les valeurs d'une item
@synthesize currentItemValue = _currentItemValue; // stocke la valeur en cours de lecture
@synthesize rssItems = _rssItems; // tableau de toutes les items
@synthesize delegate = _delegate;
@synthesize retrieverQueue = _retrieverQueue;
-(id)init{
if(![super init]) return nil;
_rssItems =[[NSMutableArray alloc]init];
return self;
}
- (NSOperationQueue *)retrieverQueue {
if(nil == _retrieverQueue) {
_retrieverQueue = [[NSOperationQueue alloc] init];
_retrieverQueue.maxConcurrentOperationCount = 1;
}
return _retrieverQueue;
}
- (void)startProcess{
SEL method = @selector(fetchAndParseRss);
[[self rssItems] removeAllObjects];
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self
selector:method
object:nil];
[self.retrieverQueue addOperation:op];
[op release];
}
-(BOOL)fetchAndParseRss{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
//To suppress the leak in NSXMLParser
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSURL *url = [NSURL URLWithString:@"http://www.ada-basket.com//cache/rss20.xml"];
NSLog(@"ouverture de l'URL %@ ", url);
BOOL success = NO;
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:YES];
[parser setShouldReportNamespacePrefixes:YES];
[parser setShouldResolveExternalEntities:NO];
success = [parser parse];
[parser release];
[pool drain];
return success;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
if(nil != qualifiedName){
elementName = qualifiedName;
}
NSLog(@"lecture de : %@", qualifiedName);
if ([elementName isEqualToString:@"item"]) {
self.currentItem = [[[rssParser alloc]init]autorelease];
}else if ([elementName isEqualToString:@"media:thumbnail"]) {
self.currentItem.mediaUrl = [attributeDict valueForKey:@"url"];
} else if([elementName isEqualToString:@"title"] ||
[elementName isEqualToString:@"description"] ||
[elementName isEqualToString:@"link"] /*||
[elementName isEqualToString:@"guid"] ||
[elementName isEqualToString:@"pubDate"]*/) {
self.currentItemValue = [NSMutableString string];
} else {
self.currentItemValue = nil;
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if(nil != qName){
elementName = qName;
}
NSLog(@"%@ <- %@ ", qName, self.currentItemValue);
if([elementName isEqualToString:@"title"]){
self.currentItem.title = self.currentItemValue; // <--------------------------- problème ici
}else if([elementName isEqualToString:@"description"]){
self.currentItem.description = self.currentItemValue;
}else if([elementName isEqualToString:@"link"]){
self.currentItem.linkUrl = self.currentItemValue;
}/*else if([elementName isEqualToString:@"guid"]){
self.currentItem.guidUrl = self.currentItemValue;
}else if([elementName isEqualToString:@"pubDate"]){
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
self.currentItem.pubDate = [formatter dateFromString:self.currentItemValue];
[formatter release];
}*/else if([elementName isEqualToString:@"item"]){ // quand on arrive sur la balise sortante "item" on stock dans le tableau
NSLog(@"enregistrement dans le tableau des currentItem");
[[self rssItems] addObject:self.currentItem];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(nil != self.currentItemValue){
NSLog(@"chaine trouvée : %@", self.currentItemValue);
[self.currentItemValue appendString:string];
}
}
- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
//Not needed for now
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"erreur d'interprétation");
if(parseError.code != NSXMLParserDelegateAbortedParseError) {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[(id)[self delegate] performSelectorOnMainThread:@selector(processHasErrors)
withObject:nil
waitUntilDone:NO];
}
}
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"fin du document");
[(id)[self delegate] performSelectorOnMainThread:@selector(processCompleted)
withObject:nil
waitUntilDone:NO];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
-(void)dealloc{
self.currentItem = nil;
self.currentItemValue = nil;
self.delegate = nil;
[_rssItems release];
[super dealloc];
}
@end
Pourtant j'ai l'impression de bien manipuler mes objets... alors je bugue ou ?
Dernière modification par thanathz (27-08-2010 14:11:48)
Hors ligne
salut,
Ca dit surtout que tu essayes d'appeler la méthode setTitre mais qu'elle n'existe pas. Fais une recherche sur setTitre ou .titre dans ton code et tu devrais trouver l'erreur.
Hors ligne
My Bad, j'ai fait une copie d'un mauvais log, parce que j'avais essayé de changer de nom de propriété à un moment...
Hors ligne
ok. j'ai jamais été très bon pour trouver les erreurs, surtout quand y a pas tout le code. Mais en se basant sur le message d erreur tu devrais vérifier que "self.currentItem" est bien une instance de NewsList au moment ou ca plante.
Hors ligne
Je vais checker ça (j'ai pas fait), et je donne le résultat... en même temps je mets tout le code de rssparser.m
Mouais, mouais mouais... ça serait bien ça le problème...
Je viens d'ajouter un
NSLog(@"****** etat de currentItem : %@ ", self.currentItem);
juste avant mon erreur
et j'ai do
2010-08-27 14:13:54.496 ADA[867:4703] lecture de : title
2010-08-27 14:13:54.497 ADA[867:4703] chaine trouvée :
2010-08-27 14:13:54.497 ADA[867:4703] chaine trouvée : Kai Williams confirm
2010-08-27 14:13:54.497 ADA[867:4703] title <- Kai Williams confirmé
2010-08-27 14:13:54.498 ADA[867:4703] ****** etat de currentItem : <rssParser: 0x3b51b00>
2010-08-27 14:13:54.498 ADA[867:4703] *** -[rssParser setTitle:]: unrecognized selector sent to instance 0x3b51b00
Dernière modification par thanathz (27-08-2010 14:17:38)
Hors ligne
Solution trouvée :
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
if(nil != qualifiedName){
elementName = qualifiedName;
}
NSLog(@"lecture de : %@", qualifiedName);
if ([elementName isEqualToString:@"item"]) {
self.currentItem = [[[NewsList alloc]init]autorelease]; // <----- ici j'avais rssParser
}else if ([elementName isEqualToString:@"media:thumbnail"]) {
self.currentItem.mediaUrl = [attributeDict valueForKey:@"url"];
} else if([elementName isEqualToString:@"title"] ||
[elementName isEqualToString:@"description"] ||
[elementName isEqualToString:@"link"] ) {
self.currentItemValue = [NSMutableString string];
} else {
self.currentItemValue = nil;
}
Merci Nimau !!!!
Dernière modification par thanathz (27-08-2010 14:40:22)
Hors ligne
bah de rien la morale de l'histoire: toujours se fier au message d'erreur de la stack trace.
Hors ligne
L'iPhone sur iPhon.fr, le blog de l'iPhone - blog iPad
iPhon.fr et son forum ne sont pas liés à Apple, Orange, SFR ou autres et les marques citées sont la propriété de leurs détenteurs respectifs.