2011-06-01 1 views
0

L'objet Imagepair est une variable membre d'une autre classe. Je souhaite que ses membres soient modifiés chaque fois que j'appelle la fonction getImageURLs (demande une page Web et analyse ses éléments). La première fois que cela fonctionne bien, mais si j'appelle la fonction une deuxième fois sur le même objet, l'application se bloque et me laisse avec une exception EXC_BAC_ACCESS. Je suppose que je suis en train de faire quelque chose de mal avec la gestion de la mémoire, mais je ne sais pas quoi, étant donné que j'ai un background en Java et que je ne suis pas vraiment habitué à gérer la mémoire manuellement.Type d'exception: EXC_BAD_ACCESS (SIGBUS)

@implementation Imagepair 

@synthesize imageLeft; 
@synthesize imageRight; 
@synthesize imageURLLeft; 
@synthesize imageURLRight; 
@synthesize idLeft; 
@synthesize idRight; 

//get random imagepair link 
- (void) getImageURLs{ 
    NSLog(@"Get random imagepair from server"); 

NSError *error = nil; 

NSURL *url = [NSURL URLWithString:cSERVER_GET_RANDOM_IMAGE]; 
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:url]; 
[request startSynchronous]; 

//init HTML-parser 
HTMLParser *parser = [[HTMLParser alloc] initWithString: [request responseString] error:&error]; 

//check for error 
if (error) { 
    NSLog(@"Error: %@", error); 
} 

//get body-node 
HTMLNode *bodyNode = [parser body]; 

//get all link-nodes 
HTMLNode *success = [bodyNode findChildTag:@"success"]; 
HTMLNode *imgurl1 = [success findChildTag:@"imgurl1"]; 
HTMLNode *imgurl2 = [success findChildTag:@"imgurl2"]; 
HTMLNode *imgid1 = [success findChildTag:@"imgid1"]; 
HTMLNode *imgid2 = [success findChildTag:@"imgid2"]; 
HTMLNode *imgvotes1 = [success findChildTag:@"imgvotes1"]; 
HTMLNode *imgvotes2 = [success findChildTag:@"imgvotes2"]; 

//read content and set members 
[self setImageURLLeft:[imgurl1 contents]]; 
[self setImageURLRight:[imgurl2 contents]]; 
votesLeft = [[imgvotes1 contents] intValue]; 
votesRight = [[imgvotes2 contents] intValue]; 
[self setIdLeft:[imgid1 contents]]; 
[self setIdRight:[imgid2 contents]]; 
[self setImageLeft:[self requestImage:imageURLLeft]]; 
[self setImageRight:[self requestImage:imageURLRight]]; 

[request release]; 
[parser release]; 
} 

//returns an UIImage for an URL 
-(UIImage *)requestImage:(id)url{  
    NSURL *imgURL = [NSURL URLWithString:url]; 
    NSData *data = [NSData dataWithContentsOfURL:imgURL]; 
    UIImage *image = [[UIImage alloc] initWithData:data]; 
    return image; 
    } 
} 
+1

Nous avons besoin de savoir comment les différentes propriétés @ ont été définies (assigner, conserver, copier, etc.). Publiez également la trace de la pile si vous le pouvez. – NSGod

+0

trouvé le problème, était dans une autre classe, où j'ai publié un objet, qui était dans un autorelease-pool .. merci apple pour faire des messages d'erreur bien expliquant:/ – dschihejns

Répondre

3

Dans requestImage: vous initialiser un UIImage mais jamais le relâcher. Changez return image en return [image autorelease] ou renommez la méthode en newRequestImage: afin qu'il soit clair qu'elle renvoie une image conservée.

+0

merci, j'ai oublié cela. – dschihejns