'>'的左操作数是垃圾值

时间:2011-10-28 05:19:36

标签: iphone objective-c ios

当我构建并安装我的应用程序时,我会收到以下内存警告

  

“'>'的左操作数是一个垃圾值“在这一行isTrue =(newLength> 20)?不:是的;

这里有什么问题。谢谢你的帮助

 (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength;
    BOOL isTrue;
    if(textField == txtFirstName){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue = (newLength > 20) ? NO : YES;
    }
    if(textField == txtLastName){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue = (newLength > 20) ? NO : YES;
    }
    if(textField == txtEmail){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue =  (newLength > 100) ? NO : YES;
    }
    if(textField == txtCompanyName){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue =  (newLength > 30) ? NO : YES;
    }
    if(textField == txtPassword){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue =  (newLength > 30) ? NO : YES;
    }
    if(textField == txtRe_EnterPassword){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue =  (newLength > 30) ? NO : YES;
    }
    if(textField == txtZipCode){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue =  (newLength > 20) ? NO : YES;
    }
    if(textField == txtCountry){
        newLength = [textField.text length] + [string length] - range.length;
        //isTrue =  (newLength > 30) ? NO : YES;
    }
    isTrue = (newLength > 20) ? NO : YES;

    return isTrue;
}

5 个答案:

答案 0 :(得分:16)

当所有if条件都失败时,即出现问题。如果textField不是您期望的那个集合之一。

在这种情况下,newLength永远不会被分配给,并且将是随机垃圾值。 虽然这可能“永远不会发生”,但静态分析仪并不知道这一点。

您应该初始化newLength以获得默认值,可能为零。

答案 1 :(得分:1)

分析仪无法确认您的“类似开关的构造”没有“通过”。如果所有 if 案例都失败,则newLength的值可能永远不会被设置。然后在那个事件中,它作为垃圾值。

答案 2 :(得分:1)

我已经对您的代码进行了一些更改,我认为现在它会更好用。

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = 0;
    BOOL isTrue = false;

    if(textField == txtFirstName){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue = (newLength > 20) ? NO : YES;
    }
    else if(textField == txtLastName){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue = (newLength > 20) ? NO : YES;
    }
    else if(textField == txtEmail){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue =  (newLength > 100) ? NO : YES;
    }
    else if(textField == txtCompanyName){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue =  (newLength > 30) ? NO : YES;
    }
    else if(textField == txtPassword){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue =  (newLength > 30) ? NO : YES;
    }
    else if(textField == txtRe_EnterPassword){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue =  (newLength > 30) ? NO : YES;
    }
    else if(textField == txtZipCode){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue =  (newLength > 20) ? NO : YES;
    }
    else if(textField == txtCountry){
        newLength = [textField.text length] + [string length] - range.length;
        isTrue =  (newLength > 30) ? NO : YES;
    }
    else {
        isTrue = (newLength > 20) ? NO : YES;
    }

    return isTrue;
}

答案 3 :(得分:0)

您的代码可能是正确的,如果(至少)您的一个if测试始终保证通过。但分析仪无法确定。如果你可以说服自己,你可以忽略警告。

但更好的想法是将这些更改为其他ifs,然后放入最后一个,其中是NSAssert。

答案 4 :(得分:0)

尝试 [比较:b]如果< b,则返回-1。 b,如果a == b,则为0;如果是>,则为1;湾

isTrue =([newLength compare:20] == 1)?不:是的;