実行時にオブジェクトのスーパークラスを変更することはできますか?もしそうなら、どうですか?オブジェクトのスーパークラスを動的に変更する
答えて
短い質問、短い答え:はい、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
後者をサブクラスに置き換えます。サブクラスも基本クラスであるため、これは有効な継承です。
これは非常に危険です。なぜあなたは地球にいたいのですか? –
もしそれがうまくいけば、それは非常に強力です、リンゴはKVOのためにそれを使用します:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo
私は個人的にそれを検査するために使用しますコード:私はいくつかの情報を記録し、元のメソッドをスーパーで呼び出すために興味のあるメソッドをサブクラス化して上書きします。 – vikingosegundo
ObjCランタイムを使用することは間違いありませんが、少し毛深いでしょう。これはAppleのドキュメントへのリンクです:Objective-C Runtimeとその使用例:Objective-C Runtime Programming。
- 1. オブジェクトのスーパークラスを変更するには?
- 2. リフレクション - Javaでオブジェクトをスーパークラスに動的に変換する
- 3. JTreeオブジェクトのサイズを自動的に変更する方法は?
- 4. JavaScriptオブジェクトのプロトタイプを動的に変更する
- 5. Paintオブジェクトの色をAndroidで動的に変更する
- 6. NHibernate内のオブジェクトを動的に変更する
- 7. スーパークラスのプロパティを変更する
- 8. javascriptでオブジェクト名を動的に変更する方法は?
- 9. 変更スーパークラスのプロパティ値
- 10. オブジェクトのプロパティを動的変数の角度で更新する
- 11. ブラウザでActiveXオブジェクトのサイズを自動的に変更します
- 12. JObjectを動的オブジェクトに変換する
- 13. JObjectを動的オブジェクトに変換する
- 14. Python + sqlAlchemy:dtypeオブジェクトを文字列に動的に変更します。
- 15. スーパークラスを動的に変更するにはどうすればいいですか?
- 16. 動的にエンティティプロパティを動的に変更する方法
- 17. Angularjs動的オブジェクトの更新
- 18. uitableviewフッターを動的に変更する
- 19. CSSを動的に変更する
- 20. java3d SceneGraphを動的に変更する
- 21. filterToolbarオプションを動的に変更する
- 22. 動的にonclickメソッドを変更する
- 23. Umbracoページテンプレートを動的に変更する
- 24. Polymer:動的にスタイルシートを変更する
- 25. 動的にQuillプレースホルダーを変更する
- 26. 動的にテキストを変更するqlabel
- 27. GridViewテンプレートフィールドを動的に変更する
- 28. yii2データベースを動的に変更する
- 29. JWTサブジェクトフィールドを動的に変更する
- 30. row_formatを動的に変更する
isa swizzleの例については、http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvoをご覧ください。 – mttrb
また、「オブジェクトのスーパークラス」はどういう意味ですか? *オブジェクト*にはスーパークラスはありません。オブジェクトにはクラスがあり、クラスにはスーパークラスがあります。ただし、オブジェクトのクラスのスーパークラスを変更すると、**そのクラスのすべてのメンバーが影響を受けます** **単一のオブジェクトだけでなく、 –
なぜスーパークラスは現在のクラスではありませんか?現在のクラスはどうなるの?あなたは最初に慎重に考える必要があります –