8

是否可以在运行时更改对象的超类?如果是这样,怎么做?

4

2 回答 2

11

一个简短的问题,一个简短的回答:是的,isa swizzling

是什么让 Objective C 动态化?,第 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 是保存的,因为我首先创建了一个基类的子类,然后用子类替换了后者。由于子类也是基类,因此这是有效的继承。

于 2013-02-25T05:24:12.033 回答
2

使用 ObjC 运行时绝对是可能的,但它会有点毛茸茸......这是苹果文档的链接:Objective-C Runtime及其用法示例:Objective-C Runtime Programming

于 2013-02-25T05:43:41.750 回答