Objective-C - 方法调度中缺少哨兵?

时间:2012-03-17 17:54:39

标签: objective-c warnings uialertview

我正在尝试覆盖UIAlertView的init方法并自定义它,我收到以下警告? “方法调度中缺少哨兵”。

这个警告意味着什么,我该如何解决?

- (id)initWithTitle:(NSString *)title 
            message:(NSString *)message 
           delegate:(id)delegate 
  cancelButtonTitle:(NSString *)cancelButtonTitle 
  otherButtonTitles:(NSString *)otherButtonTitles, ...
{
    if (self = [super initWithTitle:title 
                            message:message 
                           delegate:delegate 
                  cancelButtonTitle:cancelButtonTitle 
                  otherButtonTitles:otherButtonTitles]) 
    {
        // Customize alertView
    }

    return  self;
}

4 个答案:

答案 0 :(得分:6)

问题似乎是initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:可变参数,即在最后一个参数之后接受任意数量的参数。当你调用基类的方法时,你有两个问题:

  • 你没有传递所有参数,你提供的版本的调用者和
  • 你没有在最后一个参数之后传递最后的nil(我认为是编译器所抱怨的)。

正如其他人已经指出的那样,UIAlertView并不打算进行子类化。考虑尝试另一种方法(改为使用便利构造函数/方法)。

答案 1 :(得分:3)

看一下UIAlertView documentation,特别是:

  

子类注释

     

UIAlertView类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。

这意味着覆盖initWithTitle方法不会有用。你需要尝试另一种方法 - 也许如果你分享你想要实现的目标,那么人们可能会建议另一种方法(例如,使用类别)。

答案 2 :(得分:1)

这是警告,因为你没有在可变方法调用结束时放置nil(哨兵)。但是,无论如何,你都无法改写一种可变方法。有关详情,请参阅this question

答案 3 :(得分:0)

这是因为你不能继承UIAlertView。来自docs

  

子类注释

     

UIAlertView类旨在按原样使用   并且不支持子类化。此类的视图层次结构是   私人,不得修改。