【问题标题】:Dynamically change an object's superclass动态改变对象的超类
【发布时间】:2013-02-10 05:20:16
【问题描述】:

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

【问题讨论】:

  • 查看 stackoverflow.com/questions/11221110/… 以获取 isa swizzle 的示例。
  • 另外,“对象的超类”是什么意思? object 没有超类。一个对象有一个类,它的类有一个超类。但是,如果您更改对象类的超类,该类的所有成员都会受到影响,而不仅仅是单个对象。
  • 为什么超类不是当前类?当前班级发生了什么?你必须先仔细考虑

标签: objective-c runtime superclass


【解决方案1】:

一个简短的问题,一个简短的回答:是的,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

在单元测试课程中,我进行了调配 #导入

@implementation APIUnitTests


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

//…
@end

这个 cas 是保存的,因为我首先创建了一个基类的子类,然后用子类替换了后者。由于子类也是基类,因此这是有效的继承。

【讨论】:

  • 这听起来非常危险。你到底为什么想要?
  • 如果操作正确,它非常强大,Apple 将其用于 KVO:developer.apple.com/library/ios/#documentation/cocoa/conceptual/…
  • 我个人用它来检查代码:我继承并覆盖我感兴趣的方法来记录一些信息并在super上调用原始方法。
  • 感谢您的正当理由。
  • @RichardBrown,我添加了一个简单的例子。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多