ASIHTTPRequest проблемы на iPhone (память?) - PullRequest
0 голосов
/ 21 января 2011

Я использую ASIHTTPRequest на iPhone, чтобы позвонить на сервер, который затем отправляет ответ, содержащий файл JSON. Я установил его на базовом уровне, но когда я добавил его в свой проект и позвонил на сервер, мое приложение начало падать с bad_access.

Я звоню из viewDidLoad следующим образом:

requestModel = [[RequestModel alloc]init];
NSURL *url = [[NSURL URLWithString:@"myURL"]retain];
[requestModel eventsRequestFor:@"myUsername" password:@"myPassword" forURL:url];

Это вызывает функцию в другом классе с именем RequestModel, и я пытаюсь распаковать возвращенный массив как таковой (много кода):

-(void)eventsRequestFor:(NSString*)username password:(NSString*)password forURL:(NSURL*)forURL  {
//use ASIHTTPRequest to post to sever.  Here you authenticate and recieve answer
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:forURL];
[request setUsername:username]; 
[request setPassword:password]; 
[request setDelegate:self];

[request setDidFailSelector:@selector(uploadFailed:)];
[request setDidFinishSelector:@selector(uploadFinished:)];
[request startAsynchronous];

[request release];
NSLog(@"Model called");
}

#pragma mark Model Delegates
- (void)uploadFinished:(ASIHTTPRequest *)request  {
// Use when fetching text data

NSLog(@"upload start");
NSString *stringFromRequest = [[NSString alloc]init];
stringFromRequest = [request responseString];

[self buildArrayFromRequest:stringFromRequest];

//[stringFromRequest release];
}

- (void)uploadFailed:(ASIHTTPRequest *)request  {
NSString *statusMessage = [request responseStatusMessage];
NSLog(@"%@",statusMessage);
NSError *error = [request error];
NSLog(@"%@",error);

}   

-(void)buildArrayFromRequest:(NSString*)string  {

NSArray *arrayFromData = [[NSArray alloc]init];
arrayFromData = [string yajl_JSON];
NSLog(@"This is the array from the JSON  %@",[arrayFromData objectAtIndex:0]);
NSMutableArray *events = [[NSMutableArray alloc] init]; 

for(int i= 0; i < [arrayFromData count];i++)
{
    /////code to unpack array

}

       ///here i try to populate table with unpacked array
FirstViewController *firstVC = [[FirstViewController alloc]init];
[firstVC createTableWithArray:events];

[firstVC release];
[arrayFromData release];
[events release];

}

Есть идеи, где я иду не так? Кажется, я выпускаю объект, который уже был выпущен, но я не могу его найти.

1 Ответ

4 голосов
/ 21 января 2011

РЕДАКТИРОВАТЬ: Вы выпускаете NSData, который не ваш.

Вам не нужна эта строка:

[arrayFromData release];

из-за этой ошибки:

Вы положили:

NSArray *arrayFromData = [[NSArray alloc]init];
arrayFromData = [string yajl_JSON];

когда все, что вам нужно, это:

NSArray *arrayFromData = [string yajl_JSON]; // This doesn't need releasing

Вы отправляете запрос, который уже был автоматически выпущен: (

// Create an autoreleased request object
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:forURL];

...

[request release]; // fail here - this line is not needed

Просто к вашему сведению:

Это ненужный код:

NSString *stringFromRequest = [[NSString alloc]init];
stringFromRequest = [request responseString];

Вы создаете строковый объект, а затем получаете другой. Первый, который вы делаете, будет пропущен. Этот код будет делать то, что вы хотите:

NSString *stringFromRequest = [request responseString]; // This doesn't need releasing :)

Однако это причина утечки, а не аварии, о которой вы сообщаете.

(У вас есть этот шаблон в других местах вашего кода, не только здесь.)

...