如何获取子类将属性初始化为正确的类?

And*_*rew 4 cocoa-touch objective-c ios

我有一个名为的类SPPanelManager,它具有另一个类的属性,名为SPPanelSettingsManager.SPPanelManager的-init方法如下:

self.settingsManager = [[SPPanelSettingsManager alloc] init];
Run Code Online (Sandbox Code Playgroud)

目的SPPanelManager是进行子类化,并在我的应用程序中使用子类.例如,有SPGreetingManager.在.h文件中SPGreetingManager,我已声明:

@property (nonatomic, strong) SPGreetingSettingsManager *settingsManager;
Run Code Online (Sandbox Code Playgroud)

这使得settingsManager属于正确的类.问题是当SPGreetingManager初始化子类时,它调用上面的init方法,并将settingsManager初始化为SPPanelSettingsManager类,而不是SPGreetingSettingsManager.

我怎样才能将它初始化为该属性的正确类而不必在每个子类中重写init代码?

Nik*_*uhe 8

超类(SPPanelManager)以某种方式必须知道具体面板管理器想要用作哪个类settingsManager.

Apple使用以下方法将CALayers与UIViews匹配:

基类声明一个返回具体SPPanelSettingsManager子类的类方法:

// in SPPanelManager.h
+ (Class)settingsManagerClass;
Run Code Online (Sandbox Code Playgroud)

...哪些子类重写以返回其自定义类:

// in SPGreetingManager.m
+ (Class)settingsManagerClass
{
    return [SPGreetingSettingsManager class];
}
Run Code Online (Sandbox Code Playgroud)

现在,超类可以实例化设置管理器,如下所示:

self.settingsManager = [[[[self class] settingsManagerClass] alloc] init];
Run Code Online (Sandbox Code Playgroud)