NSString, EXC_BAD_ACCESS и stringByAppendingString - PullRequest
0 голосов
/ 26 мая 2010

я написал следующий код:

NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSDictionary *reportDic = [jsonparser objectWithString:json_string error:nil];
NSDictionary *reporttable = [reportDic objectForKey:@"reporttable"]; 
NSArray *rows = [reporttable objectForKey:@"rows"];


NSString *table = [[NSString alloc]initWithString:@"<table>"] ;
for (NSDictionary *row in rows)
{

    table = [table stringByAppendingString:@"<tr>"];

    NSArray *cells = [row objectForKey:@"cells"];
    for (NSString *cell in cells){
        table = [table stringByAppendingString:@"<td>"];
        table = [table stringByAppendingString:cell];
        table = [table stringByAppendingString:@"</td>"];
    }

    table = [table stringByAppendingString:@"</tr>"];
    index++;
}
table = [table stringByAppendingString:@"</table>"];
return [table autorelease]; 

строки являются json ответом, проанализированным jsonlib эта строка возвращается в viewcontroller, который загружает его в веб-представление, но я продолжаю получать exc_bad_access для этого кода по завершении метода, который его вызывает, мне даже не нужно загружать его в веб-представление, просто вызывая этот метод и не используя nsstring вызывает ошибку при завершении вызывающего метода ... любая помощь будет оказана, спасибо.

- (void)viewDidLoad {

[super viewDidLoad];

AMAppDelegate *appDelegate = (AMAppDelegate*)[[UIApplication sharedApplication] delegate];
NSString * data = [appDelegate fetchTable:name psw:psw];

[webView loadHTMLString:@"this is html" baseURL:nil];
[data release];
}

с выпуском или без, не имеет значения

Ответы [ 3 ]

4 голосов
/ 26 мая 2010

Ваше управление памятью неверно.

Изменение:

NSString *table = [[NSString alloc]initWithString:@"<table>"] ;

до:

NSString *table = [[[NSString alloc]initWithString:@"<table>"] autorelease];

Затем измените:

return [table autorelease];

до:

return table;

Причина в том, что таблица, которую вы автоматически выпускаете в конце, - это таблица, построенная в предыдущей строке:

table = [table stringByAppendingString:@"</table>"];

Таким образом, вы автоматически выпускаете это дважды (stringByAppendingString: возвращает автоматически выпущенный экземпляр), а исходную таблицу вообще не освобождает.

1 голос
/ 26 мая 2010

Как насчет построения таблицы с использованием NSMutableString ?Одна из проблем вашего текущего подхода заключается в том, что вы автоматически заполняете пул автоматического выпуска.

NSMutableString *table = [NSMutableString string];

[table appendString:@"<table>"];
for (NSDictionary *row in rows)
{
    [table appendString:@"<tr>"];

    NSArray *cells = [row objectForKey:@"cells"];
    for (NSString *cell in cells){
        [table appendFormat:@"<td>%@</td>", cell];

    [table appendString:@"</tr>"];

    index++;
}
[table appendString:@"</table>"];
return table;
0 голосов
/ 26 мая 2010

Что касается обновления, если вы правильно включили в него предложения, -fetchTable:psw: возвращает автоматически выпущенное NSString, поэтому вы не должны выпускать его в методе вызова:

NSString *data = [appDelegate fetchTable:name psw:psw]
// ...
[data release]; // don't do that, data is autoreleased

-fetchTable:psw: должен обрабатывать table вот так:

NSString *table = [NSString stringWithString:@"<table>"] ;

// ... leave the rest as it is

return table;

Обратите внимание, что вы также пропускаете json_string, вам следует -release или -autorelease.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...