ASIFormDataRequest Exc_Bad_Access - PullRequest
       13

ASIFormDataRequest Exc_Bad_Access

1 голос
/ 28 ноября 2011

Я использую ASIFormDataRequest, и он дает мне EXC_BAD_ACCESS где-то со следующим кодом. Я включил NSZombie и, насколько я могу судить, это как-то связано с ASIFormDataRequest, и в нем говорится, что ответственная библиотека - GraphicsServices.

У меня есть отдельный класс, который содержит разные методы для возврата данных, и из моих UIViewControllers я могу вызывать эти методы ...

- (Account *) signInAccount:(NSString *)duid user:(NSString *)userName password:    (NSString *)passWord
{
Account *myAccount = [[[Account alloc] init] autorelease];

NSURL *apiURL = [NSURL URLWithString:@"http://xxxxxxxxxxxxxxx.com/api.json"];
ASIFormDataRequest *request = [[ASIFormDataRequest requestWithURL:apiURL] autorelease];
[request addPostValue:@"duid025" forKey:@"duid"]; //todo - add the actual passed in value
[request addPostValue:userName forKey:@"user[email]"];
[request addPostValue:passWord forKey:@"user[password]"];
[request setUsername:@"xxxxxxxx"];
[request setPassword:@"yyyyyyyy"];

[request startSynchronous]; 

int statusCode = request.responseStatusCode;

NSDictionary *json = [request.responseString JSONValue];
NSString *status = [json valueForKeyPath:@"status"];
NSLog(@"API JSON %@", request.responseString);

myAccount.statusCode = statusCode;

if(statusCode == 200)
{
    myAccount.status = status;
    myAccount.error = @"";
    Credentials *myCredentials = [[Credentials alloc] init];
    myCredentials.emailAddress = userName;
    myCredentials.passWord = passWord;
    myAccount.credentials = myCredentials;

    //assign division to default division

}
else if(statusCode==403)
{
    NSString *error = [json valueForKeyPath:@"error"];
    myAccount.status = status;
    myAccount.error = error;
}
else
{
    // major issue, probably connection
}

return myAccount;
}

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Я считаю, что проблема в этой строке:

ASIFormDataRequest *request = [[ASIFormDataRequest requestWithURL:apiURL] autorelease];

Поскольку вы не выделяете и не инициализируете свой объект запроса с помощью alloc / init, объект уже автоматически высвобождается. Таким образом, вы вызываете autorelease для объекта, который уже является auto-release. Попробуйте это:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:apiURL];
1 голос
/ 28 ноября 2011

В строке

ASIFormDataRequest *request = [[ASIFormDataRequest requestWithURL:apiURL] autorelease];

вы вызываете autorelease для объекта, который вам не принадлежит. Вам нужно только освободить принадлежащие вам объекты (то есть те, которые созданы с использованием методов, содержащих имена new, alloc или copy).

Измените строку на

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:apiURL];

Объект запроса уже будет автоматически освобожден.

...