Objective-C中如何正确将Getter用作选择器?解决AFNetworking的Xcode弃用警告
修复AFNetworking旧版本initWithCoder中的NSKeyedUnarchiver弃用警告
使用旧版本AFNetworking的应用整体运行正常,但在initWithCoder方法的以下代码行收到Xcode弃用警告:
self.queryStringSerializationStyle = (AFHTTPRequestQueryStringSerializationStyle)[[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))] unsignedIntegerValue];
警告内容如下:
*** -[NSKeyedUnarchiver decodeObjectForKey:]: value for key (queryStringSerializationStyle) is not an object. This will become an error in the future.
对比前一行可正常运行的代码,我不理解为何这段代码会报错(我并不擅长Objective-C):
self.mutableHTTPRequestHeaders = [[decoder decodeObjectOfClass:[NSDictionary class] forKey:NSStringFromSelector(@selector(mutableHTTPRequestHeaders))] mutableCopy];
问题根源
queryStringSerializationStyle是无符号整数类型(基础数据类型),而decodeObjectOfClass:forKey:是专门用来解码NSObject子类对象的方法。之前的代码错误地用对象解码方法处理基础类型,导致系统抛出警告——未来这类操作会直接报错。
而前一行代码中的mutableHTTPRequestHeaders是NSDictionary对象,完全适配对象解码方法,所以没有问题。
修复方案
方案一:直接改用基础类型解码方法
用专门针对无符号整数的解码方法decodeUnsignedIntegerForKey:,无需通过NSNumber中转,代码更简洁:
self.queryStringSerializationStyle = (AFHTTPRequestQueryStringSerializationStyle)[decoder decodeUnsignedIntegerForKey:NSStringFromSelector(@selector(queryStringSerializationStyle))];
方案二:兼容历史归档数据(可选)
如果之前的代码是把这个整数包装成NSNumber进行归档的,为了兼容已有的旧存档数据,可以做双重兼容处理:
id archivedValue = [decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))]; if ([archivedValue isKindOfClass:[NSNumber class]]) { self.queryStringSerializationStyle = (AFHTTPRequestQueryStringSerializationStyle)[archivedValue unsignedIntegerValue]; } else { self.queryStringSerializationStyle = (AFHTTPRequestQueryStringSerializationStyle)[decoder decodeUnsignedIntegerForKey:NSStringFromSelector(@selector(queryStringSerializationStyle))]; }
内容的提问来源于stack exchange,提问作者Doug Smith
相关产品推荐
相关产品推荐

