我有一个名为MyObjectManager
的子类,它继承自RKObjectManager
在MyObjectManager
我初始化RestKit(设置基本网址等)
然后我将MyObjectManager
子类化为两个不同的类:
UserManager
和GameManager
。每个实现不同的功能
起初我打电话给UserManager sharedManager
,它运作正常。我后来用相关函数调用了GameManager sharedManager
,但是我得到一个“无法识别的选择器发送到实例”错误,因为它将后者称为UserManager
。
我在指南中读到可以多次继承RKObjectManager的子类,我缺少什么?
MyObjectManager实现:
static MyObjectManager *sharedManager = nil;
@implementation MyObjectManager
+ (instancetype)sharedManager {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *baseUrl = [NSString stringWithFormat:@"http://ip/api"];
NSURL *url = [NSURL URLWithString:baseUrl];
sharedManager = [self managerWithBaseURL:url];
sharedManager.requestSerializationMIMEType = RKMIMETypeJSON;
[sharedManager setupRequestDescriptors];
[sharedManager setupResponseDescriptors];
});
return sharedManager;
}
答案 0 :(得分:3)
那是因为RKObjectManager +sharedManager
是一种类方法。它将在第一次调用时实例化共享管理器,然后在进一步调用时返回它。您对sharedManager
的第一次调用确实实例化了一个RKObjectManager,而您对GameManager sharedManager
的调用确实返回了同一个实例。该实例属于RKObjectManager类,它不实现GameManager的功能 - 因此无法识别的选择器发送到实例错误。
这对于子类RKObjectManager
是完全可以接受的,但你也应该在+sharedManager
中继承类方法GameManager
,以返回你自己的静态实例,而不是依赖于RKObjectManager的那个。
编辑:根据您的编辑,您应该尝试在GameManager
内创建+managerWithBaseURL子类,以便返回GameManager
而不是RKObjectManager
的实例。