iPhone JSON对象发布自己?

时间:2010-05-03 16:55:16

标签: iphone objective-c

我正在使用iPhone的Objective-C的JSON Framework插件通过HTTP捕获一个JSON对象,这是一个字典样式对象数组。这是我的connectionDidFinishLoading函数:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
   [connection release];
 NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
 [loadingIndicator stopAnimating];

 NSArray *responseArray = [responseString JSONValue]; // Grab the JSON array of dictionaries
 NSLog(@"Response Array: %@", responseArray);
 if ([responseArray respondsToSelector:@selector(count)]) {
  NSLog(@"Returned %@ items", [responseArray count]);
 }
 [responseArray release];
 [responseString release];
}

问题是代码在第二行EXC_BAD_ACCESS行引发NSLog错误。我认为EXC_BAD_ACCESS错误表明变量已从内存中释放,但第一个NSLog命令工作正常(并显示数据全部存在);似乎只有在调用count消息时才会导致错误,但respondsToSelector调用至少认为responseArray应该能够响应该消息。当使用调试器运行时,它会在第二行崩溃,但是堆栈显示仍然定义了responseArray对象,并且其中有12个对象(因此调试器至少能够获得准确的{{1}该变量的内容)。

这是JSON框架创建count的问题,还是我的代码有问题?

3 个答案:

答案 0 :(得分:2)

count会返回NSUInteger,而不是对象。根据{{​​3}},您应该使用%lu并在这种情况下转换为unsigned long而不是显示它:

NSLog(@"Returned %lu items", (unsigned long)[responseArray count]);

使用%@时,NSLog()会尝试将该值解释为指向对象的指针并向其发送description消息。
在该内存位置偶然发生有效对象的可能性极小,因此代码严重失败或显示不可预测的结果。

答案 1 :(得分:2)

除了gf和Nikilai所说的,[responseArray release];超过发布

如果这些人的方法命名正确,NSArray *responseArray = [responseString JSONValue];会返回一个自动释放的实例。

答案 2 :(得分:1)

简单错字:第二个NSLog中的格式字符串包含%@而不是%d。