偶尔崩溃设置UILabel文本 - NSString substringWithRange

时间:2015-05-14 15:40:50

标签: ios objective-c cocoa-touch

我最近发现了App Store的一些崩溃报告。但是,我无法使用模拟器或iPhone 5重新创建错误。

其中一位用户通过电子邮件向我报告了问题并提供了一些细节。当用户试图打开显示录像列表的视图控制器时,该应用程序崩溃了。这是失败的视图控制器(BRRecordingsViewController)

失败的行是UILabel文本“recordingName.text”设置为文件名字符串的子字符串的位置。

文件名字符串通常是这样的:

VoCo_DATE_2015-05-14 16:14:55_NAME_Arpeggio #02

“Arpeggio#02”是该曲目的名称。 (此前的文本是唯一标识符,允许按创建日期/时间顺序显示曲目)

文件名永远不会为空 - 它至少包含文本

VoCo_DATE_2015-05-14 16:14:55_NAME_

在这种情况下,子字符串会导致:

Arpeggio #02

曲目名称可以为空。这不会导致程序失败。

以下是触发崩溃的代码部分:

UILabel *recordingName = (UILabel *)[cell viewWithTag:100];
NSRange rangeNameTag = [fileNameWithoutExt rangeOfString:@"_NAME_"];
NSRange rangeOfRecordingName = NSMakeRange(rangeNameTag.location+6, fileNameWithoutExt.length-6-rangeNameTag.location);
recordingName.text = [fileNameWithoutExt substringWithRange: rangeOfRecordingName];

以下是我从App Store崩溃日志中获得的异常。

Last Exception Backtrace

我无法重新创建错误,因此无法完全确定导致崩溃的步骤。

通过更改代码并将错误数据强制转换为字符串,我可以实现崩溃。

*** -[__NSCFConstantString substringWithRange:]: Range {9223372036854775813, 9223372036854775813} out of bounds; string length 10. This will become an exception for apps linked after 10.10 and iOS 8. Warning shown once per app execution

0 个答案:

没有答案