基于iOS平台版本的子类化

时间:2014-03-03 23:16:27

标签: ios afnetworking

我正在使用AFNetworking,我有一个为AF7TPSessionManager创建的子类,可以在iOS7上运行,我想知道我可以继承相同的子类,但是根据一些预处理器指令可以使用不同的超类说AFHTTPRequestOperationManager。 / p>

由于

3 个答案:

答案 0 :(得分:2)

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

您可以改为使用“包装器”类而不是接口 - 在内部创建特定于版本的类并将调用转发给它。

答案 1 :(得分:2)

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

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

@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

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

因此,本案例中的类集群为您提供:

  • MyiOS7HttpClientMyIos6HttpClient通过MyHttpClient的简洁界面,

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

  • 无需转发邮件。

答案 2 :(得分:0)

您无法在编译时执行此操作。编译器不知道您的应用程序将在哪个受支持的iOS版本上运行。您可以创建该类的多个版本,并根据运行时版本检查创建正确的版本。