Cocoa - `stringWithContentsOfURL / dataWithContentsOfURL`导致错误?

时间:2011-04-16 04:41:44

标签: iphone objective-c cocoa file

以下代码由于某种原因从根本上起作用。我已经多次检查过这个URL并不好笑(它返回我要解析的纯文本)。代码是100%功能然后它停止工作并开始给我EXC_BAD_ACCESS错误。

调试输出中没有任何内容可以发布除线以外的信息,表示输出正在切换到进程两次。 (有时候会有关于双重释放的事情。)

到目前为止(我记得很多)我试过了:

  • 重新安装应用程序 - 它只在“默认”运行时出现问题(而不是第一次运行/启动运行。)
  • 在浏览器中运行URL(chrome,firefox,IE ...)
  • 将来电置于@try / @catch区块
  • 使用retain
  • 使用临时NSAutoreleasePool
  • 拆分/分离呼叫的元素(连同登录一切 - 一旦遇到错误,没有任何记录
  • 使用上述
  • dataWithContentsOfURL功能

NSAutoreleasePool *tmpPool = [[NSAutoreleasePool alloc] init];

NSString *url_string = [self getNormalVersionDownloadURL];
NSLog(@"urlString: -%@-", url_string);
NSError *er;

NSURL *the_URL = [[NSURL URLWithString:url_string] retain];
NSString *version_String =  [NSString stringWithContentsOfURL:the_URL encoding:NSASCIIStringEncoding error:&er];

NSLog(@"verions_string: -%@-", version_String);

if ([version_String length] < 16)
    return;

[tmpPool release];

(由http://discussions.apple.com/thread.jspa?threadID=1667544添加NSAutoreleasePoolautorelease

(兑现页面 - http://webcache.googleusercontent.com/search?q=cache:8D7zlQdG9PMJ:discussions.apple.com/thread.jspa%3FthreadID%3D1667544+http://discussions.apple.com/thread.jspa%3FthreadID%3D1667544&cd=1&hl=en&ct=clnk&gl=us&source=www.google.com

2 个答案:

答案 0 :(得分:3)

discussion.apple.com目前正在关闭,所以我无法阅读讨论主题。无论如何:


NSString *url_string = [[self getNormalVersionDownloadURL] autorelease];

-getNormalVersionDownloadURL是返回拥有还是非拥有对象?如果方法返回拥有的对象,则只发送-autorelease


NSError **er;

这应该是NSError *er,或者应该使用NSError *类型的变量的地址进行初始化。由于后者不常见且不必要,因此以下假定为NSError *er


NSURL *the_URL = [[NSURL URLWithString:url_string] autorelease];

+URLWithString:会返回您不拥有的NSURL对象,因此您不会(自动)释放它。


version_String = [[NSString stringWithContentsOfURL:the_URL 
    encoding:NSASCIIStringEncoding error:er] autorelease]; //ERROR occurs here

两个问题:: +stringWithContentsOfURL:会返回您不拥有的NSString对象,因此您不会(自动)释放它。此外,第三个参数应为&er而不是er

答案 1 :(得分:0)

URLWithString和stringWithContentsOfURL是方便的方法,然后已经将变量放入autorelease中我认为你不需要在创建the_URL和version_String时添加自动释放

尝试删除autorelease ...