方法调度中缺少哨兵

Ben*_* Lu 11 cocoa subclass objective-c nsarray

我想创建一个子类,NSMutableArray并需要覆盖该-initWithObjects:方法.

但如何调用[超级xxx];?

- (id) initWithObjects:(id)firstObj, ... {
    [super initWithObjects:firstObj]; // Error: Missing sentinel in method dispatch
    // Error: The result of a delegate init call must be immediately returned or assigned to "self"

}
Run Code Online (Sandbox Code Playgroud)

谢谢.

小智 46

然后"缺少哨兵"消息指的是缺少的无终止.事实上,根据所有知识字体维基百科:

在Objective-C中终止可变长度参数列表的nil的名称

另外:Sentinel节点,一个表示数据结构末尾的对象:Sentinel值,用于终止循环的值:在Bisync等网络协议中,sentinel值指示帧的开始和结束位置


小智 10

你不能.正如以下文档中NSArray所讨论:

您可能希望为子类实现适合于子类正在管理的后备存储的初始化程序.NSArray类没有指定的初始化程序,因此初始化程序只需要调用init方法super.NSArray类采用NSCopying,NSMutableCopying和NSCoding协议; 如果您希望通过复制或编码创建自己的自定义子类的实例,请覆盖这些协议中的方法.

因此,您可以将self = [super init];初始化对象中的对象分配并添加到结果对象中.实际上,由于实现的方式NSArray,调用任何-initWith…方法都可能返回不同 NSArray子类的实例.

请注意,文档还讨论了子类化的替代方法,NSArray这些方法可能更容易,更可靠或更好.