Если у вас где-то есть NSNull, вы, вероятно, используете JSON-анализатор или CoreData. Если число в CoreData не установлено, CoreData вернет вам NSNull - возможно, то же самое относится и к значениям NSString в CoreData.
Точно так же вы можете иметь пустые элементы в JSON, возвращаемые с сервера, и некоторые парсеры будут выдавать это как объект NSNull. Таким образом, в обоих случаях вы должны быть осторожны при использовании значений, поскольку то, что вы считали объектом NSString или NSNumber, действительно является NSNull.
Одним из решений является определение категории в NSNull, которая просто игнорирует все непонятные сообщения, отправленные объекту, в соответствии с кодом ниже. Тогда ваш код будет работать, потому что NSNull.length вернет 0. Вы можете включить что-то подобное в файл вашего проекта .pch, который включается в каждый отдельный файл вашего проекта.
// NSNull+IgnoreMessages.h
@interface NSNull(IgnoreMessages)
- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
@end
//NSNull+IgnoreMessages.m
#import "NSNull+IgnoreMessages.h"
@implementation NSNull(IgnoreMessages)
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ( [self respondsToSelector:[anInvocation selector]] )
[anInvocation invokeWithTarget:self];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
NSMethodSignature *sig=[[NSNull class] instanceMethodSignatureForSelector:aSelector];
// Just return some meaningless signature
if(sig==nil)
sig=[NSMethodSignature signatureWithObjCTypes:"@^v^c"];
return sig;
}
@end