objective-c – 为什么指定的初始化程序不能在其基类中调用二次初始化程序?

objective-c – 为什么指定的初始化程序不能在其基类中调用二次初始化程序?,第1张

概述根据文档,Objective-C中的类的指定的初始化程序必须调用其基类的指定的初始化程序. 另一个规则是二次初始化器必须调用自己的类的指定的初始化器. 但是如果遵循第二条规则,为什么指定的初始化程序不能在其基类中调用二次初始化程序?这个基本的二次初始化器最终将调用自己的级别的D.I.所以对象仍然会被正确的初始化,对吗? 差异似乎是谁选择缺省变量的默认值 – 你或你的基类. 我们来考虑NSSet.它 根据文档,Objective-C中的类的指定的初始化程序必须调用其基类的指定的初始化程序.

另一个规则是二次初始化器必须调用自己的类的指定的初始化器.

但是如果遵循第二条规则,为什么指定的初始化程序不能在其基类中调用二次初始化程序?这个基本的二次初始化器最终将调用自己的级别的D.I.所以对象仍然会被正确的初始化,对吗?

差异似乎是谁选择缺省变量的默认值 – 你或你的基类.

解决方法 我们来考虑NSSet.它有一个指定的初始化程序:
- (ID)initWithObjects:(const ID *)objects count:(NSUInteger)cnt {   // initialization code here   return self;}

它也有一些二次初始化器,像这样:

- (ID)initWithArray:(NSArray *)array {    NSUInteger count = array.count;    ID objects[count];    [array getobjects:objects range:NSMakeRange(0,count)];    return [self initWithObjects:objects count:count];}

现在你想要一个NSSet的子类自动拒绝字符串“Bob”.所以你尽可能地覆盖你的子类中的指定的初始化器,但是你调用super的辅助初始化器之一:

@implementation BobRejectingSet- (ID)initWithObjects:(const ID *)objects count:(NSUInteger)count {    NSMutableArray *array = [[NSMutableArray alloc] initWithCount:count];    for (NSUInteger i = 0; i < count; ++i) {        if (![objects[i] isEqual:@"Bob"]) {            [array addobject:objects[i]];        }    }    return [super initWithArray:array];}

当您这样做时会发生什么:

BobRejectingSet *noBobs = [[BobRejectingSet alloc] initWithArray:someObjects];

由于您没有覆盖initWithArray:,程序调用 – [NSSet initWithArray:],它调用指定的初始化程序initWithObjects:count:.你覆盖指定的初始化程序,所以它调用你的方法.您的方法过滤出Bobs,然后调用super的辅助初始化程序initWithArray:…,它会转过来,并再次调用指定的初始化程序.无限递归.堆栈溢出.你得到了分段违规 – 核心转储的蓝调.

这就是为什么你总是使用super的指定的初始化程序.

总结

以上是内存溢出为你收集整理的objective-c – 为什么指定的初始化程序不能在其基类中调用二次初始化程序?全部内容,希望文章能够帮你解决objective-c – 为什么指定的初始化程序不能在其基类中调用二次初始化程序?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1254118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存