Тестирование на ноль в target-c - PullRequest
7 голосов
/ 22 декабря 2011

У меня есть следующий код в цикле

   NSArray * images = [definitionDict objectForKey:@"Images"];
    NSLog(@"images in definitionDict %@", images);
    if (!images )
        NSLog(@"NULL");
    else
        NSLog(@"NOTNULL");

, который дает следующие выходные данные

images in definitionDict (
    "/some/brol/brol.jpg"
)
NOTNULL
images in definitionDict <null>
NOTNULL

Я не понимаю второй случай, когда массив изображений нулевой.Почему это не правильно определяется в моем тесте?Как я могу отладить такую ​​проблему?

Ответы [ 2 ]

19 голосов
/ 22 декабря 2011

<null> не nil. nil напечатает (null) при печати. То, что у вас есть NSNull. NSNull - это объект, он просто не реагирует на многое. Он доступен для использования в качестве заполнителя.

Для проверки на NSNull вы можете использовать if ([images isEqual:[NSNull null]])

См. документы для получения дополнительной информации о NSNull

1 голос
/ 22 декабря 2011

Если вы хотите распечатать адрес памяти объекта Objective-C или любого другого указателя, вы должны использовать флаг %p, а не %@.Флаг %@, ожидает строку.

Однако, если аргумент не является строкой, NSLog автоматически вызовет -description для переданного объекта.И когда метод возвращает объект NSNull, -description этого объекта возвращает строку <null>

NSObject *o = nil;
NSLog(@"%p", o);

Вывод: 0x00000000

NSObject *o = [[NSObject alloc] init];
NSLog(@"%p", o);
[o release];

Вывод: что-то вроде 0x12345678

Mind:

NSNull *n = [NSNull null];
NSLog(@"%p", n);

Вывод: адрес памяти, который всегда будет одинаковым, но будет отличаться от 0x00000000

Правильный способ проверить, являются ли они объектами в массиве, выглядит следующим образом.

NSArray *myArray = [someObject array];
if([myArray isEqual:[NSNull null]]) {
    NSLog(@"No objects");
} else {
    NSLog(@"%d objects.", (int)[myArray length];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...