为什么指定的初始化器不能调用其基类中的辅助初始化器?

2024-02-17

根据文档,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”。因此,您尽职尽责地重写了子类中指定的初始值设定项,但您调用了超级的辅助初始值设定项之一:

@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:。您覆盖了指定的初始值设定项,因此它调用您的方法。你的方法过滤掉 Bob,然后调用 super 的辅助初始化器,initWithArray:…它转身并再次调用您指定的初始化器覆盖。无限递归。堆栈溢出。你会得到分段违规核心转储的忧郁。

这就是为什么你总是使用 super 的指定初始化器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么指定的初始化器不能调用其基类中的辅助初始化器? 的相关文章

  • 如何获取未知大小 NSArray 的前 X 个元素?

    在 ObjectiveC 中我有一个 NSArray 我们称之为NSArray largeArray 我想要一个新的NSArray smallArray仅包含前 x 个对象 或者如果largeArray 的大小已经 这种方法 NSArray
  • 如何降低iphone的sdk Audioqueue的声音?

    我正在使用 Aran Mulhollan 的 RemoteIOPlayer 在 SDK iphone 中使用音频队列 我可以毫无问题 添加两个信号来混合声音 通过乘以从 wav 文件中获得的 UInt32 来增加音量 但所有其他操作都会给我
  • 为什么 Obj-C 属性默认所有权“分配”而不是“强”

    我正在向旧项目添加 Swift 类 一切进展顺利 直到我尝试向 Swift 类添加属性 生成的标头无法编译 我认为问题是 在生成的代码中 Swift 省略了strong所有权并仅将其声明为nonatomic 这通常应该足够了 因为 prop
  • 在 xcode 中使用线程调用函数

    我在 xcode 中创建了一个线程 并且给出了从该线程调用的函数名称 但我的问题是 给 call 的函数名称没有被调用 知道何时在该函数中放置断点 code NSThread myThread myThread start self per
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • 使用 hibernate 的多态“get”,多对一,InheritanceType.JOINED

    我有这样的东西 具有多个座位中的一个座位的汽车类别 Seat 有一个子类 LeatherSeat public class Car private Seat seat ManyToOne fetch FetchType LAZY publi
  • UIAlertController 在 iOS 9 中不工作

    I have added the UIAlertController code showing login and password textfields it works for iOS 8 but in iOS 9 not works
  • UISegmentedControl 中的自定义字体禁用调整FontSizeToFitWidth

    我已经为我的 UISegmentedControl 设置了自定义字体 但它似乎禁用了默认字体自动调整字体大小以适合宽度范围 Before After 这是我用来设置自定义字体的代码 UISegmentedControl segmentedC
  • 创建类似于邮件应用程序菜单的 iPhone 弹出菜单

    当您想要回复消息时 我想创建一个类似于邮件应用程序中的弹出菜单 我在多个应用程序中看到过这一点 所以我不确定框架中是否内置了某些内容或一些示例代码 在 Swift 中创建操作表 代码已使用 Swift 5 进行测试 从 iOS 8 开始 U
  • NSHTTPCookieStorage 是否跨应用程序持续存在?

    所以我只是好奇 NSHTTPCookieStorage 是否跨应用程序持久存在 或者仅在当前应用程序本地 我希望在另一个应用程序中收集的一些 cookie 可以在搜索应用程序中访问 是这样的吗 谢谢 PS 这是在 iPhone 或 iPad
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa
  • Objective-C:在哪里定义宏以便随处可用?

    我有一个 iOS 应用程序 它在许多视图控制器中使用相同的字符串 数字等 所以我认为最好在一个文件中定义这些常量并在所有视图控制器实现中使用它 优点是更改一个数字 我只需要做一次 而不是在所有视图控制器中都使用该数字 实际上 我的 h 文件
  • UITableview 中的水平和垂直滚动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I want to make a lineup for a festival You can see what I want to a
  • 将第 3 方库 ZXing 导入 Xcode

    我尝试了多种方法将第 3 方库 ZXing 导入我的 iOS 应用程序 但所有方法都很痛苦 或者根本不起作用 如果有人可以建议我做错了什么 或者提出导入 ZXing 等库的更好方法 我将非常感激 一定比这个容易 这就是我所做的 结果是 My
  • iPad 照片选择器崩溃

    我正在使用以下函数根据 UIActionSheet 的结果激活设备相机或图像选择器 如果 fromCamera YES 那么它适用于 iPhone 和 iPad 如果 fromCamera NO 那么它可以在 iPhone 上运行并出现图像
  • 是否有适用于 iPad 2 的条码扫描仪 SDK? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • 在 Objective C 的类方法中引用类本身

    我希望我没有跳过 ObjC 手册中的这一部分 但是是否可以从类的一个类方法中引用该类 就像在 PHP 中一样 您将使用 this 来引用当前实例 而 self 引用实例的类 this 的 ObjC 等价物将是 self 那么 PHP 的 s
  • UIPanGestureRecognizer 对坐标的限制

    我在主 UIView 中添加了一个子视图 称为panel 并且我向其中添加了gestureRecognizer 因为我希望它只能在Y轴上拖动并且只能在某些限制下 即160 300 超过300它不能拖动 我以这种方式实现了手势处理 IBAct
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后

随机推荐

  • 无法从 nginx 获取第一个请求的 uid

    我已经在 nginx 中安装了 uid 模块 还添加了与 uid 相关的配置 userid on userid name uid userid expires 365d userid p3p policyref w3c p3p xml CP
  • 如何从基类(非抽象类)调用重载函数?

    DVD类继承了Media类 比基类多了一个变量 我声明一个指针 Media ptr new DVD 我想打印出 DVD 的内容 因此以下代码可以按预期工作 ptr gt print cout 但是使用重载的 cout lt lt ptr l
  • 如何在张量流中按元素方式将张量的每一行乘以其余行

    我有一个像这样的张量 tf docs tf constant 0 2 1 1 2 2 2 1 3 5 2 2 dtype tf int32 我需要按元素将每一行乘以其余行 然后对结果求和 完成第一行后 我们将处理第二行和其余行 然后 所以结
  • 无点动态函数组合

    我正在尝试将这个函数重构为无意义的 function siblings me return R pipe family R reject equalsMe me me 我想通过me到管道中的函数以及值family返回 尝试了一些事情R us
  • 使用带有 Pathogen 的 .vim 插件

    我想使用 lustyjuggler 和 lustyExplorer 它们是 vim 插件 但我希望我们的 Pathogen 来管理它们 通常我解压 vim 插件 整个文件夹结构进入 vim bundle 但对于 lustyJuggler 和
  • 从另一个基于应用程序的类继承 UWP 应用程序类时,名称“AppClass”不存在于命名空间“...”中

    我想要实现的只是继承 UWP App 类 而不是从 Windows UI Xaml Application 类继承 而是从某个基类继承 从 标准 类继承 但是 当我这样做时 namespace MyNamespace sealed part
  • 单例时间跨多个区域触发 Azure Function

    我有一个时间触发的 Azure 函数部署在多个区域中 我希望在它们之间具有单例行为 例如 如果这些区域是美国西部和欧洲中部 我希望每次只运行其中一个区域 这能实现吗 As the 文档 https learn microsoft com e
  • 安装设备所有者应用程序的更新

    有谁知道更新发生时通过 Google Play 分发的设备所有者应用程序的生产行为是什么 正如我们所知 安装设备所有者应用程序涉及一些动机并且并不容易 重置为出厂默认设置 然后通过 NFC 为设备提供第二个设备等 因此 即使我们认为这一步已
  • g++ 两次链接同一个库会出现问题吗?

    我注意到 当我使用 gcc 制作应用程序并在链接阶段查看输出时 我看到以下库包含两次 home rb01 opt trx HEAD gcc 4 2 4 lib lib64 libstdc so 所以我只是想知道这是 g gcc 的问题还是第
  • 有什么解决方案可以将向量解包为 C++ 中的函数参数吗?

    我实际上正在考虑类似于 python 中的 运算符的东西 如下所示 args 1 2 4 f args C 中有类似的解决方案吗 我能想到的如下 template
  • NetBeans + GWT 2.2.0 + Maven编译问题

    我正在尝试使用 NetBeans 6 9 中的 Google Web Toolkit 创建 Maven Web 应用程序项目 我已按照该视频中显示的步骤进行操作 http www youtube com watch v M iVZ5TJ21
  • 我可以更改点图上的一个标记大小吗?

    使用 Seaborn 的pointplot我创建了以下图像 我想知道是否可以将每个标记的大小更改为唯一值 该图像是通过调用制作的 sns pointplot x Partying y Province ci 95 data df join
  • 发布表单时的 post 与 put

    当评估表单是否已提交时 我检查方法是否为 post 而不是 get 有人告诉我 这是一个好方法 可以了解表单是通过单击 提交 按钮提交的 而不仅仅是由在 url 中传递数据的脚本提交的 put 方法怎么样 看起来和 post 很相似 是否可
  • AngularJS $location 没有模板

    我想使用 locationProviderAngularJS 中的服务 无需在我的中渲染新的 HTML 模板ng view 我有一个div通过按需显示的元素ng show绑定到数据元素的存在 我想通过以下方式将其连接到浏览器位置 locat
  • 使用三元运算符的缺点

    我的源代码中有以下语句 int tableField1 int tableField2 int propertyField1 int propertyField2 if tableField1 null propertyField1 tab
  • 在C中将XImage写入.bmp文件

    我正在使用以下代码将 XImage 写入文件 bitmap0 bmp 但是当我在 fedora 中使用 imageViewer 打开新创建的文件时 它会给出 文件过早结束 错误并且不显示任何内容 谁能指出以下代码中的问题吗 typedef
  • Synthesia 可以很好地播放 MIDI 文件而没有任何音符关闭事件吗?

    我有一个 mid file this https pastebin com amkth128具体一个 除了标题块之外 这里是 MIDI 的相关部分 第一个轨道块仅包含元事件 并被描述为 4D 54 72 6B 00 00 00 52 Tra
  • 从公钥+私钥创建 RSAParamaters 对象

    我需要使用私钥和公钥 key 和 cer 文件 在 Net 中创建 RSAParameters 对象 是否可以在 Net 中做到这一点而不使用第三方软件 如果是这样 我应该去哪里寻找 我最终需要从该对象中提取指数 模数 D P Q DP D
  • XCode 4.3 命令行工具包校验和无效

    Apple 提供的用于使用 Xcode 4 3 安装命令行工具的软件包已损坏 我似乎需要它 因为我正在开发一些命令行工具 有没有人找到 Apple 提供的 Xcode 4 3 的替代命令行包 或者该主题的解决方法 Xcode 包含一个新的
  • 为什么指定的初始化器不能调用其基类中的辅助初始化器?

    根据文档 Objective C 中类的指定初始值设定项必须调用其基类的指定初始值设定项 另一个规则是辅助初始化器必须调用其自己类的指定初始化器 但是 如果遵循第二条规则 为什么指定的初始值设定项不能调用其基类中的辅助初始值设定项 这个基本