0

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

谢谢!

4

1 回答 1

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];
}
于 2013-07-20T01:00:12.107 回答