我目前正在尝试解析来自Web服务的数据并将其格式化在我的UITableView中。
项目详情: 部署目标:ios 4.3
jsonTapped函数:
-(void) jsonTapped
{
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost"]];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
path:@""
parameters:@{@"provider":@"12",
@"var":@"titles"}];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
// Print the response body in text
NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
orderItems = [str objectFromJSONString];
list = [orderItems objectAtIndex:0];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@", error);
}];
[operation start];
}
数据以字典数组的形式出现。我已经检查过班级检查功能。 List是在.h文件中声明的字典,orderItems是在.h文件中声明的NSArray。
当我去更新我的UITableView时,情况非常糟糕。如果我尝试访问列表中的一段数据(在我的jsonTapped函数之外的任何地方),整个事情就会崩溃。
我该如何解决这个问题?关于为什么我输入orderItems数组的信息没有被保留的任何想法?
当它崩溃时,它只是说(lldb)然后指示我使用绿色错误代码“线程1:EXC_BAD_ACCESS ......”
谢谢!
答案 0 :(得分:0)
我看到你正在为你的类变量分配一个自动释放的对象。如果你使用的是ivar,你必须自己保留这些信息。使用属性更容易,您可以将其声明为保留。方法如下:
在你的.h
@interface MyClass {
NSArray *orderItems;
NSDictionary *list;
}
@end
变为:
@interface MyClass
@property (nonatomic, retain) NSArray *orderItems;
@property (nonatomic, retain) NSDictionary *list;
@end
在您的.m文件中,使用jsonTapped
方法:
orderItems = [str objectFromJSONString];
list = [orderItems objectAtIndex:0];
变为:
self.orderItems = [str objectFromJSONString];
self.list = [orderedItems objectAtIndex:0];
你也可以这样做:
orderItems = [[str objectFromJSONString] retain];
list = [[orderItems objectAtIndex:0] retain];
但是,你必须记得在某个地方释放它们,否则你会有内存泄漏。
对于属性,就像将它们设置为nil
一样简单。编译器将知道在必要时释放该对象。
以下是您的dealloc
方法的样子:
- (void)dealloc {
self.orderItems = nil;
self.list = nil;
...
[super dealloc];
}