Что должен делать этот (NSNull *) контроллер == [NSNull null]? Почему не просто контроллер == ноль? - PullRequest
11 голосов
/ 14 мая 2009

В примере с Apple я видел это:

myController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) {
    controller = [[myController alloc] initWithPageNumber:page];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
    [controller release];
}

Мне очень интересна эта строка:

if ((NSNull *)controller == [NSNull null]) {

Если бы я сделал это, я бы просто проверил на ноль. Почему они делают это так чертовски сложно? И что это на самом деле делает? Для меня это выглядит так, будто они приводят объект контроллера к NSNull, а затем проверяют, совпадает ли это с null от NSNull.

A.F.A.I.K. ноль означает «нет объекта», а ноль означает «ничего». Пожалуйста, помогите мне получить четкое изображение здесь!

Ответы [ 2 ]

12 голосов
/ 14 мая 2009

Большинство контейнеров не позволяет вставлять в них объект 'nil'. Если вы действительно хотите вставить нулевое значение в ваш контейнер, можно использовать экземпляр NSNull (NSNull - одиночный).

В вашем конкретном примере контроллер выбирается из массива. Тогда рекомендуется убедиться, что объект не является экземпляром NSNull.

1 голос
/ 03 июля 2010

Классы коллекций, такие как NSArray и NSDictionary, не могут содержать nil значений. Ваш ivar, viewController, является экземпляром класса коллекции. NSNULL был создан специально как заполнитель для nil, и вы можете поместить его в классы коллекции.

Класс NSNull определяет одноэлементный объект, что означает, что существует только один экземпляр NSNull (который вы создаете с помощью [NSNull null]), но он может использоваться в любом количестве мест, по вашему желанию. 1012 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...