是否可以在運行時更改對象的超類?如果是這樣,怎麼樣?動態更改對象的超類
回答
一個簡短的問題,一個簡短的回答:是的,ISA混寫
What Makes Objective C Dynamic?, page 66
一個例子:
我有一個處理一個REST的API連接的類,它是稱爲APIClient。在測試中,我想連接到不同的服務器。
在測試目標I子類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
在單元測試I類做混寫 #進口
@implementation APIUnitTests
+(void)load
{
client = [[ApiClient alloc ] init];
object_setClass(client, [TestApiClient class]);
}
//…
@end
這CAS是保存,因爲我首先創建的一個子類基類,然後用子類替換後者。由於子類也是一個基類,這是有效的繼承。
這聽起來非常危險。你爲什麼想要? – 2013-02-25 05:35:27
如果做得對,它是非常強大的,蘋果使用它的KVO:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo 2013-02-25 05:36:39
我親自使用它來檢查代碼:我創建子類並覆蓋我感興趣的方法來記錄一些信息並在超級方法上調用原始方法。 – vikingosegundo 2013-02-25 05:40:12
使用ObjC運行時絕對有可能,但它會有點毛茸茸......這是一個鏈接到蘋果的文檔:Objective-C Runtime和其使用示例:Objective-C Runtime Programming。
- 1. 如何更改對象的超類?
- 2. 如何動態更改超類?
- 3. 動態更改JavaScript對象的方法
- 4. jQuery:動態更改對象的屬性
- 5. 更改動態對象的屬性
- 6. 更改動態對象的分層
- 7. 基於動態對象的更改值
- 8. C#動態更改對象的屬性
- 9. python動態更改超級
- 10. 緩存動態更改對象列表
- 11. 在Django中動態更改QuerySet對象
- 12. 如何根據綁定對象的類型動態更改DataTemplate?
- 13. 動態修改javascript對象
- 14. 如何在節點對象的狀態更改時動態更改JTree視圖?
- 15. 更改對象類型
- 16. 對象類型更改
- 17. 改造:處理動態更改其名稱的JSON對象
- 18. Angular2 - 更改類動態
- 19. 動態更改CSS類
- 20. 動態更改CSS類名
- 21. 使用jquery動態更改超鏈接
- 22. 動態與對象類型
- 23. 更改Cocos2d中的對象的狀態
- 24. 對象是抽象類的超類嗎?
- 25. 通過AJAX更改對象的狀態
- 26. 更改靜態成員對象的值
- 27. 動畫NSLayoutConstraints更改(以及對更改後的對象有約束的對象)
- 28. 將靜態類型的對象展開爲動態對象
- 29. 超類對子類對象的引用
- 30. 如何在源對象更改時動態更新綁定?
查看http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo查看isa swizzle的示例。 – mttrb 2013-02-25 05:29:19
另外,「對象的超類」是什麼意思?一個*對象*沒有超類。一個對象有一個類,它的類有一個超類。但是,如果您改變對象類的超類,那麼該類的所有成員都將受到影響,而不僅僅是該單個對象。 – 2013-02-25 05:31:00
爲什麼超類不是現在的類?當前課程發生了什麼?你必須先仔細思考 – 2013-02-25 05:33:44