我正在使用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
的问题,还是我的代码有问题?
答案 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。