実行時にオブジェクトのスーパークラスを変更することは可能ですか? もしそうなら、どのように?
質問する
5242 次
2 に答える
11
短い質問、短い答え: はい、スウィズリングです
例:
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 に答える