#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) ? НЕТ: ДА;