Iphone NSURL URLWithString:引发异常

Iphone NSURL URLWithString:引发异常,iphone,objective-c,crash-reports,Iphone,Objective C,Crash Reports,简而言之,[NSURL URLWithString:似乎引发了一个异常。根据文档“如果字符串格式不正确,则返回nil。”没有提到在任何情况下都会引发异常。除此之外,在将字符串转换为URL之前,我还要对URL进行编码并检查nil 任何人都可以提供任何建议,关于它可能是什么异常,或者在转换URL之前我应该做什么其他错误检查 如果您对细节感兴趣,调用代码如下所示: NSString* tmpText = [newUrl stringByAddingPercentEscapesUsingEncoding

简而言之,
[NSURL URLWithString:
似乎引发了一个异常。根据文档“如果字符串格式不正确,则返回nil。”没有提到在任何情况下都会引发异常。除此之外,在将字符串转换为URL之前,我还要对URL进行编码并检查
nil

任何人都可以提供任何建议,关于它可能是什么异常,或者在转换URL之前我应该做什么其他错误检查

如果您对细节感兴趣,调用代码如下所示:

NSString* tmpText = [newUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if (tmpText == nil) {
    // error handling
}
else {
    NSURL* tmpURL = [NSURL URLWithString:tmpText];
这是从iTunes Connect下载的崩溃报告的一部分:

8   libobjc.A.dylib                 0x300c1f84 objc_exception_throw
9   CoreFoundation                  0x3029a598 +[NSException raise:format:arguments:]
10  CoreFoundation                  0x3029a538 +[NSException raise:format:]
11  Foundation                      0x30696dde -[NSURL initWithString:relativeToURL:]
12  Foundation                      0x30696cd8 +[NSURL URLWithString:relativeToURL:]
13  Foundation                      0x30696cae +[NSURL URLWithString:]
14  Yummy                           0x000146ca -[DeliciousPostCell setUrl:] + 46
似乎URL的格式有点“不好”,但实际上应该返回一个
nil
而不是一个例外

我从来没有见过自己引发异常,所以我不能使用XCode捕获代码并查看发生了什么。而遇到问题的用户从未直接联系过我,因此我无法询问更多详细信息。非常感谢您的建议


更新(14/7/2009):看起来像这样的黑客行为,但我在可疑行周围添加了一个异常块。我还提出了一份雷达bug报告(#7031551),建议代码应该与文档匹配。

我遇到过一些API抛出异常的情况,这些异常不应该与文档相符。我的建议是确保(在您的实际代码中)tmpText真的不是nil(在这种情况下会引发异常,因为大多数期望NSStrings的api都不是nil保存在那里)。之后,只需添加异常处理,并向bugreporter.apple.com提交一份bugreport

您的字符串,
tmpText
,一定是格式不正确(意思是它的某些内容不符合规范)。不幸的是,由于您无法从用户处获得该变量的确切内容,因此我无法帮助您找出其格式不正确的原因。有关类似行为的报告,请参见苹果开放式雷达上的帖子。我知道该报告是关于将
nil
传递到
URLWithString
,但如果它将
nil
视为与任何其他格式错误的字符串相同,则行为(引发异常)可能是相同的


我建议您看看
newUrl
是如何创建的,看看您是否能找到任何可能存在不允许字符进入的边缘情况。我猜这就是问题所在。

记录字符串的原始值以查看
-initWithString:
的输入是什么是值得的。需要注意的一点是,
-stringByAddingPercentEscapesUsingEncoding:
只会转义URL中非法的字符,它们对上下文没有任何影响。因此,如果输入字符串为“http:::host;:”,这样它就不会转义任何字符,并且仍然是一个无效的URL。

在使用newUrl和tmpText之前,您可以做一个日志并查看其中的内容吗。这会让你知道从哪里开始寻找

stringByAddingPercent。。。永远不会返回nil(除非newUrl为nil)


如果传递给它的字符串格式不正确,则URLWithString:调用将返回nil。因此,url对象是您应该关注的nil检查(在调用openURL:method之前)

NSURL为格式错误的url返回nil,NSLog您的字符串并设置断点,以准确查看传递给NSURL创建方法的内容。如果您的URLWithString使用硬编码的值,这进一步证明了您所传递的内容格式不正确。使用incode和其他字符串方法添加percentescapeses时要小心,因为它们也会添加一些额外的垃圾,您的NSURL收件人可能会被它们扼杀

如果URLWithString:返回nil,一切都会很好——我稍后会在代码中检查这一点。不幸的是,它抛出了一些未知的异常。雷达报告看起来确实很熟悉!谢谢你的链接。你认为使用CFURLCreateStringByAddingPercentEscapes而不是stringByAddingPercentEscapes:会有帮助吗?我最后在代码的某些部分使用了它。使用CF方法唯一的好处是可以指定要转义的合法URL字符列表,这在构建表单编码的参数列表或放置用户名/密码信息(可能包含URL格式字符)时非常有用进入你自己设计的网址。在处理用户输入时,通常最好单独请求组件,或者修剪输入的URL字符串的标准部分,以确保具有有效的主机/路径配对。然后,你可以使用CF方法对这些组件进行清理,然后再将它们串在一起。斯蒂芬,你有没有找到导致这种情况的特定字符串?@MikeAbdullah,恐怕没有。
@try
块工作正常,因此我从那以后就没有看到过崩溃,而且应用程序也不会“打电话回家”。苹果在iOS 5 beta 2发布时关闭了雷达,所以它可能会被修复。。。