Objective c NSString、EXC_BAD_访问和stringByAppendingString
我编写了以下代码:Objective c NSString、EXC_BAD_访问和stringByAppendingString,objective-c,cocoa,nsstring,Objective C,Cocoa,Nsstring,我编写了以下代码: NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; NSDictionary *reportDic = [jsonparser objec
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];
无论是否发布,内存管理都是错误的 更改:
NSString *table = [[NSString alloc]initWithString:@"<table>"] ;
致:
原因是您在末尾自动删除的表是前一行构造的表:
table = [table stringByAppendingString:@"</table>"];
table=[table stringByAppendingString:@”“;
因此,您将自动释放该表两次(
stringByAppendingString:
返回一个自动释放的实例),而根本不释放原始表。您的内存管理是错误的
更改:
NSString *table = [[NSString alloc]initWithString:@"<table>"] ;
致:
原因是您在末尾自动删除的表是前一行构造的表:
table = [table stringByAppendingString:@"</table>"];
table=[table stringByAppendingString:@”“;
因此,您将自动释放该表两次(
stringByAppendingString:
返回一个自动释放的实例),而根本不释放原始表。关于更新,如果您正确地合并了tewhas的建议,-fetchTable:psw:
返回一个自动释放的NSString
,因此,您不应该在调用方法中释放它:
NSString *data = [appDelegate fetchTable:name psw:psw]
// ...
[data release]; // don't do that, data is autoreleased
-fetchTable:psw:
应该像这样处理表
:
NSString *table = [NSString stringWithString:@"<table>"] ;
// ... leave the rest as it is
return table;
NSString*表=[nsstringwithstring:@”“;
// ... 剩下的就这样吧
返回表;
请注意,您也在泄漏
json\u string
,您应该-release
或-autorelease
它。关于更新,如果您正确地合并了tewhas的建议,-fetchTable:psw:
返回一个自动删除的NSString
,因此您不应该在调用方法中释放它:
NSString *data = [appDelegate fetchTable:name psw:psw]
// ...
[data release]; // don't do that, data is autoreleased
-fetchTable:psw:
应该像这样处理表
:
NSString *table = [NSString stringWithString:@"<table>"] ;
// ... leave the rest as it is
return table;
NSString*表=[nsstringwithstring:@”“;
// ... 剩下的就这样吧
返回表;
请注意,您也在泄漏
json\u字符串
,您应该-release
或-autorelease
它。使用?当前方法的一个问题是会不必要地淹没自动释放池
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;
NSMutableString*表=[NSMutableString];
[表附录字符串:@”“];
用于(NSDictionary*行中的行)
{
[表附录字符串:@”“];
NSArray*单元格=[row objectForKey:@“单元格];
for(NSString*单元格中的单元格){
[表格格式:@“%@”,单元格];
[表附录字符串:@”“];
索引++;
}
[表附录字符串:@”“];
return table;
如何使用函数构造表?当前方法的一个问题是会不必要地淹没自动释放池
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;
NSMutableString*表=[NSMutableString];
[表附录字符串:@”“];
用于(NSDictionary*行中的行)
{
[表附录字符串:@”“];
NSArray*单元格=[row objectForKey:@“单元格];
for(NSString*单元格中的单元格){
[表格格式:@“%@”,单元格];
[表附录字符串:@”“];
索引++;
}
[表附录字符串:@”“];
return table;
然后你需要发布调用方法。然后你需要发布调用方法。@amnon:你也需要不释放调用方法中的字符串。然后它应该可以工作。如果不可以,发布你修改过的代码,因为tewha所说的应该可以工作。谢谢,这就解决了我在这之后得到的exec\u bad\u访问的问题由于在处理json请求的nsmutablerequest对象时出错,它花了一些时间查找,但malloc_history做到了……感谢everyoneamnon,你不了解iPhone/Mac OS X内存管理的时间越长,你需要更正的代码就越多。确保你阅读了上面的苹果文本。你可能不会理解它完全还没有,但你会更接近。:@amnon:你也不需要在调用方法中释放字符串。那么它应该可以工作。如果没有,请发布你的修订代码,因为tewha所说的应该可以工作。谢谢,这解决了我在这之后得到的exec_bad_访问的问题,因为处理nsmutablerequest对象f时出错或者json请求,它花了一些时间找到它,但malloc_history做到了…谢谢大家,你不了解iPhone/Mac OS X内存管理的时间越长,你需要更正的代码就越多。确保你阅读了上面的苹果文本。你可能还不能完全理解它,但你会更接近它。:)有一个类似的例子在构建CSV文件时出现了一个类似的情况。这解决了它!在构建CSV文件时出现了一个类似的情况。这解决了它!