使用来自AFnetworking的JSON解析数据时,UITableView崩溃

时间:2013-07-20 00:49:40

标签: ios uitableview afnetworking jsonkit

我目前正在尝试解析来自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 ......”

谢谢!

1 个答案:

答案 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];
}