Iphone NSString子字符串带范围崩溃
我有以下代码:Iphone NSString子字符串带范围崩溃,iphone,objective-c,nsstring,Iphone,Objective C,Nsstring,我有以下代码: - (void)splitAndSendString:(NSString *)string withAlignment:(UITextAlignment)alignment verticalExpansion:(NSUInteger)verticalExpansion horizontalExpansion:(NSUInteger)horizontalExpansion inRed
- (void)splitAndSendString:(NSString *)string
withAlignment:(UITextAlignment)alignment
verticalExpansion:(NSUInteger)verticalExpansion
horizontalExpansion:(NSUInteger)horizontalExpansion
inRed:(BOOL)isRed
leftBumperString:(NSString *)leftString
rightBumperString:(NSString *)rightString
lineLength:(NSUInteger)lineLength
{
NSInteger charactersLeftAfterString = lineLength - [string length] -
[leftString length] - [rightString length];
// if either of the bumpers is nil, then replace it with @""
//so that we don't get "null" printed
if (leftString == nil) { leftString = @""; }
if (rightString == nil) { rightString = @""; }
if (charactersLeftAfterString < 0) {
NSInteger charactersAvailableForString =
[string length] + charactersLeftAfterString;
[self sendString:[NSString stringWithFormat:@"%@%@%@", leftString, [string substringWithRange:NSMakeRange(0, charactersAvailableForString)], rightString] withAlignment:UITextAlignmentLeft verticalExpansion:verticalExpansion horizontalExpansion:horizontalExpansion inRed:isRed];
}
//(a lot of other code here that isn't relevant)
}
-(void)splitAndSendString:(NSString*)字符串
withAlignment:(UITextAlignment)对齐
垂直扩展:(整数)垂直扩展
水平扩展:(NSUTEGER)水平扩展
inRed:(BOOL)isRed
LeftBumpersString:(NSString*)leftString
RightBumpersString:(NSString*)rightString
lineLength:(整数)lineLength
{
NSInteger charactersLeftAfterString=线宽-[字符串长度]-
[左字符串长度]-[右字符串长度];
//如果其中一个保险杠为零,则将其替换为@“”
//这样我们就不会打印“空”了
如果(leftString==nil){leftString=@”“;}
如果(rightString==nil){rightString=@”“;}
if(charactersLeftAfterString<0){
NSInteger字符可用于字符串=
[string length]+charactersLeftAfterString;
[self-sendString:[NSString stringWithFormat:@“%@%@@”,leftString,[string substringWithRange:NSMakeRange(0,charactersAvailableForString)],rightString]带对齐方式:UITextAlignment左垂直扩展:垂直扩展水平扩展:水平扩展输入:isRed];
}
//(这里有很多其他不相关的代码)
}
由于NSRange错误,sendString方法正在崩溃。我不明白这是怎么可能的,因为给定if语句的条件,charactersAfterString必须小于0,所以charactersAvailableForString总是小于字符串长度,那么,范围怎么可能比字符串长度长呢?您是否使用了调试器并检查了字符串的
charactersAvailableForString
的值
。。。还是打印出来的
。。。或者在崩溃时查看值?您是否使用了调试器并检查了
charactersAvailableForString
的值
。。。还是打印出来的
。。。或者在崩溃时查看值?如果字符串为空,即[string length]=0 [字符串substringWithRange:NSMakeRange(0,charactersAvailableForString)] 每次都将始终给出NSRange异常,无论发生什么情况 字符串<0的字符可用 如果[string length]=5,charactersLeftAfterString=-12,也会出现类似的问题。 charactersAvailableForString=5-12=-7
[string substringWithRange:NSMakeRange(0,charactersAvailableForString)]将给出NsRange异常。如果字符串为空,即[string length]=0 [字符串substringWithRange:NSMakeRange(0,charactersAvailableForString)] 每次都将始终给出NSRange异常,无论发生什么情况 字符串<0的字符可用 如果[string length]=5,charactersLeftAfterString=-12,也会出现类似的问题。 charactersAvailableForString=5-12=-7
[string substringWithRange:NSMakeRange(0,charactersAvailableForString)]将给出NsRange异常。我想说遗漏了一些相关代码,例如调用者。如果
lineLength
不正确,那么其他计算都不正确。你是对的,但它是如何得出这个数字的,相对来说是深奥而复杂的,基本上它总是33或以上。永远不要为0。您应该尝试记录所有这些数值。你很快就会发现为什么射程变长了invalid@refulgentis:在临时变量中记录并存储所有范围。然后您可以在调试器中单步执行每一行,我打赌您会很快发现您的小逻辑错误。检查代码执行情况,胜过每次猜测。@PeyloW-谢谢,但我没有写那段代码,我想说一些相关的代码被遗漏了,例如调用方。如果lineLength
不正确,那么其他计算都不正确。你是对的,但它是如何得出这个数字的,相对来说是深奥而复杂的,基本上它总是33或以上。永远不要为0。您应该尝试记录所有这些数值。你很快就会发现为什么射程变长了invalid@refulgentis:在临时变量中记录并存储所有范围。然后您可以在调试器中单步执行每一行,我打赌您会很快发现您的小逻辑错误。检查代码执行情况,胜过每次猜测。@PeyloW-谢谢,但我没有编写代码+1这是直接的,应该直接指向问题。不幸的是,我不能,它来自崩溃报告。我在考虑写一个简单的工具,在它上面抛出一堆字符串,加入一些断言,这样当坏状态发生时,你可以中止正在发生的任何事情。并且,如果可能的话,向用户展示一个“嘿,介意我提交一些东西给我,让应用程序更好吗?”对话框。+1这是直截了当的,应该直接指向问题。不幸的是,我不能,它来自崩溃报告。我在考虑写一个简单的工具,在它上面抛出一堆字符串,加入一些断言,这样当坏状态发生时,你可以中止正在发生的任何事情。如果可能的话,向用户展示一个“嘿,介意我提交一些东西给我,让应用程序更好吗?”对话框。