UIVIew超类对象调用子类方法而不是自己范围内的方法

时间:2013-09-03 13:59:55

标签: ios objective-c inheritance runtime

我的超类定义了一个名为“commonInit”的私有方法,该方法仅在构造时调用。

超类由2个额外的类派生,每个类也实现一个名为“commonInit”的方法

在构造派生类的对象时,我在调试器中看到从超类的范围调用子类方法。

这似乎是一种非常危险的行为 - 即使是在通过诡计你“覆盖”你的超类私人方法的一个微不足道的情况下

如果不重命名超类中的方法,我怎样才能克服这种行为?

示例:

@interface ASuperView : UIView
@end

@implementation ASuperView
-(id)init
{
  self = [super init];
  if(self)
  {
    [self commonInit]; // BOOM - The derived view method is called in this scope
  }
  return self;
}

-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
  if(self)
  {
    [self commonInit];
  }
  return self;
}

-(void)commonInit
{
  //setup the view
}

@end

@interface ADerivedView : ASuperView

@end

@implementation ADerivedView
-(id)init
{
  self = [super init];
  if(self)
  {
    [self commonInit];
  }
  return self;
}

-(id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if(self)
  {
    [self commonInit];
  }
  return self;
}

-(void)commonInit
{
  //setup the view for the derived view
}
@end

在此图像PXTextMessageBox派生自PXTextBox

两者都私下声明方法common init

enter image description here

2 个答案:

答案 0 :(得分:1)

obj-c中没有'私人'方法。最好你可以从头的使用者隐藏一个方法的存在,但是通过设计,任何对你的对象有引用的人都可以调用它实现的任何方法 - 即使他们没有在头中定义了那个方法。您最好的选择是定义一个新方法,比如_private_commonInit,而不是在类标题中共享它。

答案 1 :(得分:0)

我相信这实际上是设计的。多态性最好! .. self实际上指的是最初发送消息的对象(并不总是自我出现的类实例)...解决这个问题的一种方法是以相同的方式链接commonInit。对[super commonInit]的调用将从子类调用正确的方法...