Forum iPhone, iPad, Apple Watch de iPhon.fr

Forum utilisateurs Apple iPhone, iPad, Apple Watch, forfaits et accessoires

Vous n'êtes pas identifié(e).

Annonce

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 ! ;-)

#1 26-08-2010 17:51:24

thanathz
Membre
Inscription : 26-08-2010
Messages : 4

unrecognized selector sent to instance

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

#2 26-08-2010 22:25:24

nimau
Développeur iPhone Invité
Inscription : 06-07-2009
Messages : 166
Site Web

Re : unrecognized selector sent to instance

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

#3 27-08-2010 12:06:49

thanathz
Membre
Inscription : 26-08-2010
Messages : 4

Re : unrecognized selector sent to instance

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

#4 27-08-2010 13:49:04

nimau
Développeur iPhone Invité
Inscription : 06-07-2009
Messages : 166
Site Web

Re : unrecognized selector sent to instance

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

#5 27-08-2010 14:10:47

thanathz
Membre
Inscription : 26-08-2010
Messages : 4

Re : unrecognized selector sent to instance

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 wink

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

#6 27-08-2010 14:38:54

thanathz
Membre
Inscription : 26-08-2010
Messages : 4

Re : unrecognized selector sent to instance

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

#7 27-08-2010 23:57:40

nimau
Développeur iPhone Invité
Inscription : 06-07-2009
Messages : 166
Site Web

Re : unrecognized selector sent to instance

bah de rien smile la morale de l'histoire: toujours se fier au message d'erreur de la stack trace.

Hors ligne

Pied de page des forums

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.