2013-06-15 5 views
0

У меня есть это приложение, где я заполняю NSDictionary, а затем выполняю вычисления в словаре.NSString имеет значение null, но код не распознается как null

  tmp = nil; 
      tmp = [singleEvent objectForKey:@"start_date"]; 

      if(tmp == nil) 
      { 
       startDate = [dateFormatter dateFromString:@"1800/1/1 12:00:00"]; 
      } 
      else 
      { 
       startDate = [dateFormatter dateFromString:tmp]; 
      } 

tmp - объект NSString, а singleEvent - это NSDictionary. Оба объявлены в другом месте. Я не использовал эту часть кода для простоты.

Ключевое слово «start_date» в словаре иногда содержит дату в строковом формате, а иногда оно равно null.

Я обработал условие, когда оно будет нулевым, но код никогда не ударяет по этой строке. Я узнал, отлаживая, что даже когда tmp имеет значение null, выполнение переходит к else part.

В режиме отладки я получаю это при просмотре ТМП:

TMP = (NSNull *)

Но до сих пор еще блок удар. Так что я всегда получаю исключение с помощью null-указателя.

ответ

9

NSNull отличается nil. NSNull (или, более явно, [NSNull null]) является одноэлементным, используемым для представления концепции «nil», которая может использоваться в классах коллекции Foundation. Поскольку это одноэлементный, вам не нужно использовать -isEqual:, вы можете сравнить его напрямую.

Для проверки NSNull, вы можете сделать это:

if (tmp == [NSNull null]) 
+0

благодарит много ... выполнение удара, если теперь блок – Shuaib

1

NSNull - это нечто иное, чем ноль. Возможно, это сработает:

if ([[NSNull null] isEqual:tmp]) { 
+1

почему 'IsEqual:', вы могли бы использовать '' == –

+0

Вы правы, что == сработало бы с тех пор, как [NSNull null] гарантированно будет одиночным. Но я думаю, что этот стиль устраняет любые сомнения относительно правильности кода; любой, кто читает этот код, не должен помнить или искать в документах, гарантируется ли однотонность [NSNull null]. – faffaffaff

-1

Как насчет того, чтобы сделать это немного меньше? также я думаю, что ваша проблема в том, что вы используете objectForKey not valueForKey, valueForKey вернет Nil.

startDate = [dateFormatter dateFromString:@"1800/1/1 12:00:00"]; 

if([singleEvent valueForKey:@"start_date"]) 
     startDate = [dateFormatter dateFromString:[singleEvent valueForKey:@"start_date"]]; 

NSLog(@"%@", startDate); 
2

Ключ «start_date» словаря иногда содержать дату в виде строки, а иногда будет нулевым.

Там три случая:

  1. Ключ start_date не в словаре: возвращаемое значение objectForKey: будет nil (первое условие истинно);
  2. Ключ start_date в вашем словаре, и значение, связанное является [NSNull null] (типа (NSNull *): возвращаемое значение objectForKey: будет [NSNull null] (второе условие истинно);
  3. Ключ start_date находится в словаре и значение, связанное что-то другое: возвращаемое значение objectForKey: будет храниться объект (второе условие истинно);

Но # 2 и # 3 на самом деле то же самое: NSNull является объектом как и любой другой

.

Не путайте нулевой указатель (nil) и объект Null ([NSNull null]). Чтобы проверить первое, что вам нужно сделать:

if (!tmp) 
// or 
if (tmp == nil) 

и для второй:

if (tmp == [NSNull null]) 
Смежные вопросы