You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:10:11