Created
August 31, 2012 06:56
-
-
Save tternes/3549736 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// .h | |
@interface NSNull (null) | |
+ (void) setWarnsOnNullAccess:(BOOL) warnsOnNullAccess; | |
- (BOOL) boolValue; | |
- (char) charValue; | |
- (NSDecimal) decimalValue; | |
- (double) doubleValue; | |
- (float) floatValue; | |
- (int) intValue; | |
- (NSInteger) integerValue; | |
- (long long) longLongValue; | |
- (long) longValue; | |
- (short) shortValue; | |
- (unsigned char) unsignedCharValue; | |
- (NSUInteger) unsignedIntegerValue; | |
- (unsigned int) unsignedIntValue; | |
- (unsigned long long) unsignedLongLongValue; | |
- (unsigned long) unsignedLongValue; | |
- (unsigned short) unsignedShortValue; | |
- (id) valueForKey:(NSString *) key; | |
- (id) objectAtIndex:(NSUInteger) index; | |
- (id) objectAtIndexedSubscript:(NSUInteger) index; | |
- (NSUInteger) count; | |
- (id) objectForKey:(id) key; | |
- (id) objectForKeyedSubscript:(id) key; | |
- (NSUInteger) length; | |
@end | |
// .m | |
#define PrintAccessLog(selector) \ | |
if (warnsOnNullAccess) { \ | |
NSLog(@"Attempting to access null value from \"%@\": %@", NSStringFromSelector(selector), [NSThread callStackSymbols]); \ | |
} | |
@implementation NSNull (null) | |
static BOOL warnsOnNullAccess = NO; | |
+ (void) setWarnsOnNullAccess:(BOOL) shouldWarnOnNullAccess { | |
warnsOnNullAccess = shouldWarnOnNullAccess; | |
} | |
#pragma mark - | |
- (BOOL) boolValue { | |
PrintAccessLog(_cmd) | |
return NO; | |
} | |
- (char) charValue { | |
PrintAccessLog(_cmd) | |
return '\0'; | |
} | |
- (NSDecimal) decimalValue { | |
PrintAccessLog(_cmd) | |
return [[NSDecimalNumber zero] decimalValue]; | |
} | |
- (double) doubleValue { | |
PrintAccessLog(_cmd) | |
return 0.0; | |
} | |
- (float) floatValue { | |
PrintAccessLog(_cmd) | |
return 0.0; | |
} | |
- (int) intValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (NSInteger) integerValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (long long) longLongValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (long) longValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (short) shortValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (unsigned char) unsignedCharValue { | |
PrintAccessLog(_cmd) | |
return '\0'; | |
} | |
- (NSUInteger) unsignedIntegerValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (unsigned int) unsignedIntValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (unsigned long long) unsignedLongLongValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (unsigned long) unsignedLongValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (unsigned short) unsignedShortValue { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (id) valueForKey:(NSString *) key { | |
PrintAccessLog(_cmd) | |
return nil; | |
} | |
- (id) objectAtIndex:(NSUInteger) index { | |
PrintAccessLog(_cmd) | |
return nil; | |
} | |
- (id) objectAtIndexedSubscript:(NSUInteger) index { | |
PrintAccessLog(_cmd) | |
return nil; | |
} | |
- (NSUInteger) count { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
- (id) objectForKey:(id) key { | |
PrintAccessLog(_cmd) | |
return nil; | |
} | |
- (id) objectForKeyedSubscript:(id) key { | |
PrintAccessLog(_cmd) | |
return nil; | |
} | |
- (NSUInteger) length { | |
PrintAccessLog(_cmd) | |
return 0; | |
} | |
#pragma mark NSString Messages | |
- (NSUInteger) _fastCharacterContents { | |
PrintAccessLog(_cmd); | |
return 0; | |
} | |
- (void)getCharacters:(unichar *)buffer range:(NSRange)range { | |
PrintAccessLog(_cmd); | |
assert(range.length == 0); | |
assert(range.location == 0); | |
} | |
- (NSString *)substringFromIndex:(NSInteger)index { | |
PrintAccessLog(_cmd); | |
return nil; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment