Wenn Sie irgendwo einen NSNull haben, verwenden Sie wahrscheinlich entweder einen JSON-Parser oder CoreData. Wenn eine Zahl in CoreData nicht gesetzt ist, gibt CoreData Ihnen NSNull zurück - möglicherweise dasselbe gilt auch für NSString-Werte in CoreData.
In ähnlicher Weise können Sie leere Elemente in JSON von einem Server zurückgegeben und einige Parser geben Ihnen das als ein NSNull-Objekt. In beiden Fällen müssen Sie vorsichtig sein, wenn Sie Werte verwenden, da es sich bei der Sache, die Sie für ein NSString- oder NSNumber-Objekt hielten, tatsächlich um NSNull handelt.
Eine Lösung besteht darin, eine Kategorie in NSNull zu definieren, die einfach alle nicht verstandenen Nachrichten ignoriert, die an das Objekt gesendet werden, wie im folgenden Code beschrieben. Dann würde der Code, den Sie haben, funktionieren, weil NSNull.length 0 zurückgibt. Sie können so etwas in Ihre Projektdatei .pch einfügen, die in jeder einzelnen Datei in Ihrem Projekt enthalten ist.
// 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
Ist 'NSNull' gleich' nil'? –
Nein. NSNull und Nil sind nicht dasselbe. Ganz und gar nicht. – bbum