NULL
, nil
и 0
являются технически одинаковыми :
С MacTypes.h
#ifndef NULL
#define NULL __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
#define nil NULL
#endif /* ! nil */
И вы можете проверить, что NULL
- это некоторая вариация 0
, перебирая файлы заголовков, такие как stddef.h
.
Таким образом, чтобы убедиться, что все они существуют, просто проверьте на NULL
, или, точнее, поскольку это объекты, nil
:
if (objectA && objectB && objectC) ...
Но, ИМО, вы не должны этого делать, если вам не нужно действовать на основании того факта, что они nil
. Поскольку nil
принимает сообщения, часто может быть лучше структурировать ваш код так, чтобы nil
мог быть действительным получателем. То есть, если при отправке сообщений этим nil
объектам ничего не происходит, проблем не возникает. Другими словами, рассмотрите не использование nil
как случай ошибки, а скорее возврат *NSError
из API, которые могут дать сбой.
Что касается проблемы NSNull, в частности , я написал пример из , как упростить код с помощью функций с переменными числами . Это позволит вам написать:
if (isNSNull(objectA, objectB, objectC, objectD, nil)) ...
чтобы проверить, все ли объекты == [NSNull null]
. Вы также можете использовать похожую технику, чтобы проверить, являются ли они одним и тем же объектом:
if (isEqualTo(objectD, objectA, objectB, objectC, nil)) ...
вернет YES
, если A, B и C все ==
в D.
Суть примера:
// This is just a simple object equality comparator.
static NSComparator compareeq = ^(id obj1, id obj2) {
if (obj1 == obj2) {
return (NSComparisonResult)NSOrderedSame;
}
return (NSComparisonResult)NSOrderedDescending;
};
// This'll execute the above comparator to compare eq to each object in args
NSComparisonResult comparatorV(NSComparator compare, NSObject *eq, va_list args) {
NSComparisonResult result;
NSObject *value;
do {
if (value = va_arg(args, NSObject*)) {
result = compare(eq,value);
}
} while (value && result == NSOrderedSame);
return (!value?NSOrderedDescending:NSOrderedSame);
}
// This just test if each object passed is == [NSNull null].
BOOL isNSNull(NSObject *o, ...) {
NSNull *n = [NSNull null];
if (NSOrderedSame != compareeq(n,o)) return NO;
va_list args;
va_start(args, o);
BOOL result = (NSOrderedSame != comparatorV(compareeq,n,args));
va_end(args);
return result;
}