8

実行時にオブジェクトのスーパークラスを変更することは可能ですか? もしそうなら、どのように?

4

2 に答える 2

11

短い質問、短い答え: はい、スウィズリングです

Objective C を動的にする理由、66 ページ


例:

APIClient と呼ばれる REST-API への接続を処理するクラスがあります。テストでは、別のサーバーに接続したいと考えています。

テスト ターゲットでは、APIClient をサブクラス化します

#import "ApiClient.h"

@interface TestApiClient : ApiClient
//…
@end


@interface TestApiClient ()
@property (nonatomic, strong, readwrite) NSURL *baseURL;

@end


@implementation TestApiClient

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                      path:(NSString *)path
                                parameters:(NSDictionary *)parameters
{
    self.baseURL = [NSURL URLWithString:@"http://localhost:8000/"];
    return [super requestWithMethod:method path:path parameters:parameters];
}

@end

単体テスト クラスでは、スウィズリング #import を行います

@implementation APIUnitTests


+(void)load
{
    client = [[ApiClient alloc ] init];
    object_setClass(client, [TestApiClient class]);
}

//…
@end

最初に基本クラスのサブクラスを作成し、後者をサブクラスに置き換えたため、この cas は保存されます。サブクラスも基本クラスであるため、これは有効な継承です。

于 2013-02-25T05:24:12.033 に答える
2

ObjC ランタイムを使用することは間違いなく可能ですが、少し面倒です... これは Apple のドキュメントへのリンクです: Objective-C Runtimeとその使用例: Objective-C Runtime Programming

于 2013-02-25T05:43:41.750 に答える