Ответ 1
Похоже, у вас свисающий или дикий указатель.
Вы можете рассматривать объекты Objective-C как указатели на структуры.
Затем вы можете сравнить их с NULL
или с другими указателями.
Итак:
( myDict == NULL )
и
( myDict == [ NSNull null ] )
оба действительны.
Первый проверяет, есть ли указатель NULL
. NULL
обычно определяется как void *
со значением 0.
Обратите внимание, что для объектов Objective-C мы обычно используем nil
. nil
также определяется как void *
со значением 0, поэтому он равен NULL
. Это просто здесь, чтобы обозначить указатель NULL
для объекта, а не стандартный указатель.
Второй сравнивает адрес myDict
с экземпляром singleton класса NSNull
. Итак, вы здесь сравниваете значения двух указателей.
Итак, чтобы быстро возобновить:
NULL == nil == Nil == 0
И как [ NSNull null ]
является допустимым экземпляром:
NULL != [ NSNull null ]
Теперь об этом:
( [ myDict count ] == 0 )
Он может упасть, если у вас есть дикий указатель:
NSDictionary * myDict;
[ myDict count ];
Если не используется ARC, он обязательно сбой, потому что переменная myDict
не была инициализирована и может фактически указывать на что-либо.
Может также произойти сбой, если у вас есть висячий указатель:
NSDictionary * myDict;
myDict = [ [ NSDictionary alloc ] init ];
[ myDict release ];
[ myDict count ];
Затем вы попытаетесь отправить сообщение на освобожденный объект.
Отправка сообщения в nil
/NULL
всегда действительна в Objective-C.
Так что это зависит, если вы хотите проверить, есть ли словарь nil
, или если он не имеет значений (поскольку действительный экземпляр словаря может быть пустым).
В первом случае сравните с nil
. В противном случае проверяет, равен ли счет 0, и убедитесь, что экземпляр все еще действителен. Может быть, вы просто забыли что-то удержать.