Si tiene un NSNull en alguna parte, probablemente esté usando un analizador JSON o CoreData. Cuando un número en CoreData no está configurado, CoreData le devolverá NSNull; posiblemente lo mismo ocurra con los valores de NSString en CoreData.
De forma similar, puede tener elementos vacíos en JSON devueltos por un servidor y algunos analizadores le darán eso como un objeto NSNull. Por lo tanto, en ambos casos, debe tener cuidado cuando use valores, ya que lo que usted pensó que era un objeto NSSumerg o NSNumber es realmente NSNull.
Una solución es definir una categoría en NSNull que simplemente ignora todos los mensajes no comprendidos que se envían al objeto, según el código siguiente. Entonces el código que tiene funcionaría porque NSNull.length devolvería 0. Puede incluir algo como esto en su archivo de proyecto .pch, que se incluye en cada archivo de su proyecto.
// 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
¿'NSNull' es igual a 'nil'? –
No. NSNull y nil no son lo mismo. De ningún modo. – bbum