Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSString子字符串带范围崩溃_Iphone_Objective C_Nsstring - Fatal编程技术网

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这是直截了当的,应该直接指向问题。不幸的是,我不能,它来自崩溃报告。我在考虑写一个简单的工具,在它上面抛出一堆字符串,加入一些断言,这样当坏状态发生时,你可以中止正在发生的任何事情。如果可能的话,向用户展示一个“嘿,介意我提交一些东西给我,让应用程序更好吗?”对话框。