是否可以在运行时更改对象的超类?如果是这样,怎么样?
答案 0 :(得分:11)
一个简短的问题,一个简短的回答:是的,isa swizzling
What Makes Objective C Dynamic?, page 66
一个例子:
我有一个处理与REST-API连接的类,它叫做APIClient。在测试中,我想连接到不同的服务器。
在测试目标中,我将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是save,因为我首先创建了一个基类的子类,然后用子类替换了后者。由于子类也是基类,因此这是有效的继承。
答案 1 :(得分:2)
使用ObjC运行时肯定是可能的,但它会有点毛茸茸......这是Apple的文档链接:Objective-C Runtime及其用法示例:Objective-C Runtime Programming。