起初,对不起我的英语。我尝试用几个输入点解决问题(一些初始化器,如initWithFrame:和initWithCoder :)。不要重复我的设置代码。起初我有一个简单的解决方案,只需创建由初始化程序调用的方法(例如,#34; setup")。但是子类存在一些问题。如果我的子类有自己的初始化器,如initWithFrame:backgroundColor:和property" backgroundColor"那么它自己的覆盖"设置"将由超级初始化器调用,但" backgroundColor"仍然没有。所以这个"设置"将无法使用此属性。我认为它的常见问题和它有很好的共同解决方案,我找不到。谢谢。
答案 0 :(得分:2)
通常,我会创建一个名为_commonInit(MyClass *self)
的静态函数,并从每个初始化程序中调用它。这是一个功能,因为它不会被继承。
答案 1 :(得分:0)
基类
-(instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
[self setup];
}
return self;
}
-(instancetype)initWithCoder:(NSCoder*)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
[self setup];
}
return self;
}
-(void)setup
{
//some setup code
}
儿童班
-(instancetype)initWithFrame:(CGRect)frame param:(id)param
{
self = [super initWithFrame:frame];
if(self)
{
self.param = param;
//setup will be run by parent
}
return self;
}
-(void)setup
{
[super setup];
//child setup code
//when this code will work self.param will still nil!
}
这就是我的意思