NSString содержит: и приводит к сбою моего приложения

#iphone #objective-c

#iPhone #objective-c

Вопрос:

У меня есть NSString, которая заполняется из некоторых данных, возвращаемых через JSON.

Код отлично работает при обычных обстоятельствах, но бывает случай, когда я получаю возврат в формате JSON.

Когда я выполняю проверку, чтобы увидеть, является ли моя NSString == nil или == null, она не проходит тест.

Но тот факт, что NSString содержит сбой моего приложения.

Так имеет ли какое-то особое значение в Objective C? Или я должен просто выполнить сравнение строк и посмотреть, равна ли строка, а не равна нулю, и обработать ее таким образом.

Это меня немного смущает.

Большое спасибо, код

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

1. Можете ли вы опубликовать свой соответствующий код? Это может помочь увидеть, что происходит.

Ответ №1:

<null> это то, что NSNull возвращает для его -description метода. Вам также необходимо проверить

 myString == [NSNull null]
  

в этом случае.

Дополнительная информация: IIRC обычный материал Objective-C JSON будет использовать [NSNull null] for null s в структуре JSON, чтобы отличать значение от того, которого там просто нет.

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

1. 1. Более конкретно, классы коллекций (такие как словари и массивы) не могут содержать объекты nil, поэтому [NSNull null] вместо этого используется в качестве заполнителя.

2. Как вы думаете, почему речь идет о NSNull и коллекции? Ни то, ни другое не упоминалось в сообщении; OP говорит о NSString и регистрирует объект (строку или нет), который nil печатается (null) .

3. Потому что на самом деле это не NSString!

4. Также я сталкивался с этой проблемой раньше.

5. Конечно, это должна быть NSString, но многие вещи используют NSNull в качестве заполнителя для «null, но существует». Кроме того, (null) и <null> — это не одно и то же!

Ответ №2:

NSString * это просто указатель на NSString объект.
Для проверки наличия нулевого указателя:

 NSString *str;

if (str) {
    // str points to an object
    if ([str length] == 0) {
        // string is empty
    }
} else
    // str points to nothing
}
  

Если вы хотите проверить наличие пробелов, вы можете обрезать NSString с помощью stringByTrimmingCharactersInSet .

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

1. В общем, не следует проверять наличие nil перед вызовом метода like, length потому что [str length] он вернет 0, если str равно nil .

2. @Джон Рид: это не имеет смысла. Если вы просто проверите длину, вы в конечном итоге предположите, что у вас есть допустимый, но пустой объект string, который, вероятно, вызовет проблемы позже.

Ответ №3:

Вы могли бы проверить, является ли оно нулевым с помощью.

 if ([str isKindOfClass:[NSNull class]]) {
   // str is null.
}
  

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

1.Это не так NSNull работает. Это даст вам логическое значение false, если str есть nil , но это потому, что вы отправляете сообщение на nil , которое ничего не делает.

Ответ №4:

Я сделал это таким образом:

 if([string isKindOfClass:[NSNull class]]) {
    NSLog(@"This is JSON null");
} else {
    NSLog(@"This is a string, do what you wanna do with it");
}