Левый операнд ‘>’ является мусорным значением

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

Когда я создаю и запускаю свое приложение, я получаю приведенное ниже предупреждение о памяти

«Левый операнд ‘>’ является мусорным значением» в этой строке истру = (Новая длина> 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;
}
  

Комментарии:

1. Вы можете заменить весь метод одной строкой: return ([Текстовое поле.длина текста] [длина строки] — диапазон. длина <= 20);

Ответ №1:

Проблема возникает, когда все условия if терпят неудачу, т. Е.. if textField не является одним из множества, которое вы ожидаете.

В этом случае newLength никогда не присваивается и будет случайным мусорным значением. Хотя это, вероятно, «никогда не произойдет», статический анализатор об этом не знает.

Вы должны инициализировать newLength , чтобы иметь значение по умолчанию, возможно, ноль.

Ответ №2:

анализатор не может подтвердить, что ваша ‘switch-подобная конструкция’ не «проваливается». newLength Значение никогда не может быть установлено, если все эти случаи if завершаются неудачей. тогда в этом случае оно будет квалифицироваться как мусорное значение.

Ответ №3:

Я внес некоторые изменения в ваш код, думаю, теперь он будет работать лучше.

 (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;
}
  

Ответ №4:

Ваш код может быть правильным, если (по крайней мере) один из ваших тестов if всегда гарантированно проходит. Но анализатор не может это определить. Если вы можете убедить себя в этом, вы можете игнорировать предупреждение.

Но лучшей идеей было бы изменить их на else ifs и поместить последний else, внутри которого находится NSAssert .

Ответ №5:

Try [a compare:b] возвращает -1, если a < b, 0, если a == b и 1, если a > b .

Истру = ([Сравнение новой длины:20]==1) ? НЕТ: ДА;