我正在使用最新的SDK开发iOS 5.0+应用程序。
我收到此代码一个非常奇怪的错误:
- (NSMutableURLRequest*)setupRequestWithService:(NSString*)service andMethod:(NSString*)method { NSString* url = [NSString stringWithFormat:@"%@%@.svc/%@", serverUrl, service, method]; NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; // Set authentication token. NSLog(@"???????????? %@", authenticationToken); if (authenticationToken == nil) NSLog(@"NULL AUTHTOKEN"); if ([authenticationToken isEqual:[NSNull null]]) NSLog(@"NSNULL AUTHTOKEN"); if (request == nil) NSLog(@"NULL REQUEST"); [request addValue:authenticationToken forHTTPHeaderField:REQUEST_HEADER_AUTH_TOKEN]; return request; }
这是我的日志:
???????????? <null> NSNULL AUTHTOKEN -[NSNull length]: unrecognized selector sent to instance 0x3b5a5090 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x3b5a5090'
看来authenticationToken是NULL。但是我不明白,如果authenticationToken是NULL为什么我NULL AUTHTOKEN在日志上看不到。
authenticationToken
NULL
NULL AUTHTOKEN
我第二次运行该方法时第一次遇到此错误,我没有任何错误。这是我的日志:
???????????? (null) NULL AUTHTOKEN
顺便说说:
NSString* authenticationToken;
有什么建议吗?
也许Memory Leak某个地方…
Memory Leak
我对JSON解释器疯狂使用NSNull的解决方案是在NSNull上创建一个类别,在该类别中我定义integerValue,floatValue,length等- 全部返回0。每次遇到其他崩溃时,都添加一个新类别。当我遇到此问题时,我认为我有6或7。
不这样做的问题是,您必须在转换后的对象中到处寻找NULL-我认为是PITA。
编辑:我正在使用的代码,全部在NSNull + JSON.m文件中:
@interface NSNull (JSON) @end @implementation NSNull (JSON) - (NSUInteger)length { return 0; } - (NSInteger)integerValue { return 0; }; - (float)floatValue { return 0; }; - (NSString *)description { return @"0(NSNull)"; } - (NSArray *)componentsSeparatedByString:(NSString *)separator { return @[]; } - (id)objectForKey:(id)key { return nil; } - (BOOL)boolValue { return NO; } @end
EDIT2:现在在Swift 3中:
extension NSNull { func length() -> Int { return 0 } func integerValue() -> Int { return 0 } func floatValue() -> Float { return 0 }; open override var description: String { return "0(NSNull)" } func componentsSeparatedByString(separator: String) -> [AnyObject] { return [AnyObject]() } func objectForKey(key: AnyObject) -> AnyObject? { return nil } func boolValue() -> Bool { return false } }