2013-02-25 3 views
8

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

+0

isa swizzleの例については、http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvoをご覧ください。 – mttrb

+1

また、「オブジェクトのスーパークラス」はどういう意味ですか? *オブジェクト*にはスーパークラスはありません。オブジェクトにはクラスがあり、クラスにはスーパークラスがあります。ただし、オブジェクトのクラスのスーパークラスを変更すると、**そのクラスのすべてのメンバーが影響を受けます** **単一のオブジェクトだけでなく、 –

+2

なぜスーパークラスは現在のクラスではありませんか?現在のクラスはどうなるの?あなたは最初に慎重に考える必要があります –

答えて

11

短い質問、短い答え:はい、ISA

What Makes Objective C Dynamic?, page 66


をスウィズル例:

私はREST-APIへの接続を処理するクラスを持って、それがありますAPIClientと呼ばれる。テストでは、私は別のサーバーに接続したいです。検査対象で

は、私はスウィズリング の#importを行うユニットテストクラスで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 

をサブクラス化し、このCASは、私が最初のサブクラスを作成して、保存され

@implementation APIUnitTests 


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

//… 
@end 

後者をサブクラスに置き換えます。サブクラスも基本クラスであるため、これは有効な継承です。

+1

これは非常に危険です。なぜあなたは地球にいたいのですか? –

+1

もしそれがうまくいけば、それは非常に強力です、リンゴはKVOのためにそれを使用します:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo

+0

私は個人的にそれを検査するために使用しますコード:私はいくつかの情報を記録し、元のメソッドをスーパーで呼び出すために興味のあるメソッドをサブクラス化して上書きします。 – vikingosegundo

関連する問題