我有一个名为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;
}
因为RKObjectManager +sharedManager
是一个类方法。它将在第一次调用时实例化共享管理器,然后在以后的调用中返回它。您对sharedManager
的第一次调用确实实例化了 RKObjectManager,并且您对GameManager sharedManager
的调用确实返回了相同的实例。这个实例是类RKObjectManager,它没有实现游戏管理器的功能 - 因此无法识别的选择器发送到实例错误。
这对于子类RKObjectManager
是完全可以接受的,但您可能还应该在GameManager
内部+sharedManager
类方法进行子类化以返回您自己的静态实例,而不是依赖 RKObjectManager 的实例。
:根据您的编辑,您应该尝试在GameManager
内子类 +managerWithBaseURL,以便返回 GameManager
的实例而不是RKObjectManager
。