iPhone JSON对象释放自身?

iPhone JSON对象释放自身?,iphone,objective-c,Iphone,Objective C,我正在使用iPhone的Objective-C插件捕获一个JSON对象,它是一个通过HTTP的字典式对象数组。这是我的connectiondFinishLoading函数: - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [connection release]; NSString *responseString = [[NSString alloc] initWithData:responseData

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

- (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];
}
问题是代码在第二行
NSLog
上抛出
EXC\u BAD\u ACCESS
错误。我认为
EXC\u BAD\u ACCESS
错误表明变量已从内存中释放,但第一个
NSLog
命令工作正常(并显示数据都在那里);似乎只有在调用
count
消息时才会导致错误,但是
respondsToSelector
调用至少认为
responseArray
应该能够响应该消息。当使用调试器运行时,它在第二行崩溃,但堆栈显示仍然定义了
responseArray
对象,并且其中有12个对象(因此调试器至少能够获得该变量内容的准确
计数


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

count
返回一个
nsuiger
,而不是一个对象。根据,在本例中,您应该使用
%lu
并强制转换为
无符号long
,以显示它:

NSLog(@"Returned %lu items", (unsigned long)[responseArray count]);
使用
%@
NSLog()
尝试将该值解释为指向对象的指针,并向其发送
说明
消息。

该内存位置不太可能意外出现有效对象,因此代码肯定会严重失败或显示不可预测的结果。

count
返回的是一个
nsuiger
,而不是一个对象。根据,在本例中,您应该使用
%lu
并强制转换为
无符号long
,以显示它:

NSLog(@"Returned %lu items", (unsigned long)[responseArray count]);
使用
%@
NSLog()
尝试将该值解释为指向对象的指针,并向其发送
说明
消息。

不太可能在该内存位置意外出现有效对象,因此,代码注定会严重失败或显示不可预测的结果。

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

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

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


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

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



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

此外,您似乎不应该
释放
连接。你不应该考虑
release
ing方法中的任何变量;我还没到触发过度释放错误的程度@克里布;作为我的样板代码的一部分,我得到的连接变量的释放对我来说仍然是不必要的。看了一下文档,它似乎不需要了。@ChriB:好吧,你需要在某个地方释放连接。无论是在委托方法中(就像他现在所做的),还是在dealloc方法中(如果您将其设置为ivar)。除此之外,您似乎不应该
释放
连接。你不应该考虑
release
ing方法中的任何变量;我还没到触发过度释放错误的程度@克里布;作为我的样板代码的一部分,我得到的连接变量的释放对我来说仍然是不必要的。看了一下文档,它似乎不需要了。@ChriB:好吧,你需要在某个地方释放连接。无论是在委托方法中(就像他现在所做的那样),还是在dealloc方法中(如果您将其设置为ivar)。
%u
实际上,
count
返回一个无符号整数。@gf您是对的,我有一个懒惰的习惯,就是不使用正确的格式说明符。但是,当我们这样做时:
count
返回一个
NSUInteger
,在iPhone操作系统上,它的类型定义为
unsigned int
。在LP64(Mac OS 64位)上,它的类型定义为无符号长字符。因此,我主张使用
%lu
作为格式说明符。这应该在所有情况下都有效。
%u
实际上,
count
返回一个无符号整数。@gf你说得对,我有一个懒惰的习惯,就是不使用正确的格式说明符。但是,当我们这样做时:
count
返回一个
NSUInteger
,在iPhone操作系统上,它的类型定义为
unsigned int
。在LP64(Mac OS 64位)上,它的类型定义为无符号长字符。因此,我主张使用
%lu
作为格式说明符。这在任何情况下都应该有效;讨厌那些愚蠢的东西困住我;我通常使用
%@
作为总括,假设即使是像
NSInteger
这样的基变量类型在Objective-C中也是一个对象,因此可以通过该调用输出一些东西,但显然不是在这种情况下。@Midnight,只有Objective-C类类型的实例是对象。您必须记住,Objective-C只扩展了C。@gf是否列出了哪些类是“Objective-C”类型而不是“C”类型?我原以为
NSUInteger
(从
NSArray
“count”方法返回的是Objective-C类型,而不是
int
类型(这是一种基本的C类型),因此应该能够响应“description”消息(即使这不是最合适的处理方式)?午夜:据我所知没有。虽然没有那么多非类类型,但你应该