基于 iOS 平台版本的子类化



我正在使用AFNetworking,我有一个为AFHTTPSessionManager创建的子类,它可以在iOS7上运行,我想知道我有可能继承相同的子类,但有一个不同的超类,比如AFHTTPRequestOperationManager基于一些预处理器指令。

谢谢

处理此问题的"标准"方法是为类函数定义一个接口,然后创建"旧"和"新"类来实现该接口。 使用"工厂"为运行时环境创建正确的工厂。

你可以改用"包装器"类而不是接口 - 一个在内部创建特定于版本的类并将调用转发到它的接口。

应用工厂的使用(以类集群的形式)

请注意,下面的代码只是一个指示,它不会从复制/粘贴编译

@interface MyHTTPClient
- (void) post:(NSURLRequest *)request params:(NSDictionary *)params
@end

@implementation MyHTTPClient
- (id) init {
    if(iOS_version < 7) {
        return [[_MyiOS7HttpClient] alloc] init];
    } else {
        return [[_MyiOS6HttpClient alloc] init];
    }
}
- (void) post:(NSURLRequest *)request params:(NSDictionary *)params {
    NSAssert(NO, @"private instances should respond to this");
}
@end

现在是私有实例,这些实例在项目中不可见(仅通过MyHttpClient

#import "MyHttpClient.h"
@implementation _MyiOS7HttpClient
- (void) post:(NSURLRequest *)request params:(NSDictionary *)params {
    // use new ios7 session manager here to do stuff
}
@end

并为不使用任何 iOS7 会话管理的MyiOS6HttpClient创建一个类似的类。

因此,在这种情况下,类集群为您提供:

  • 通过MyHttpClient MyiOS7HttpClientMyIos6HttpClient的干净接口,

  • 其他代码不需要知道您实际使用的实例。

  • 无需消息转发。

你不能在编译时这样做。编译器不知道你的应用将在哪个受支持的 iOS 版本上运行。您可以创建类的多个版本,并根据运行时版本检查创建正确的版本。

最新更新