Тип исключения: EXC_BAD_ACCESS (SIGBUS) - PullRequest
0 голосов
/ 01 июня 2011

Объект Imagepair является переменной-членом некоторого другого класса. Я хочу, чтобы его члены менялись каждый раз, когда я вызываю функцию getImageURLs (запрашивает веб-страницу и анализирует ее элементы). В первый раз все работает нормально, но если я вызываю функцию 2 раза для того же объекта, приложение вылетает и оставляет исключение EXC_BAC_ACCESS. Я предполагаю, что я делаю что-то не так с управлением памятью, но я не могу понять, что, поскольку у меня есть опыт работы с Java, и я на самом деле не привык делать управление памятью вручную.

@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 Ответ

3 голосов
/ 01 июня 2011

В requestImage: вы инициализируете UIImage, но никогда не отпускаете его. Измените return image на return [image autorelease] или переименуйте метод в newRequestImage:, чтобы было ясно, что он возвращает сохраненное изображение.

...