如果 [super init] 返回 nil 该怎么办?

2023-11-24

以下面代码为例

- (id)init {
    self = [super init];
    if (self) {
        // code
    }
    return self;
}

我不希望 nil 向上传播调用层次结构。我最初的想法是在 self 为零的情况下抛出异常,创建一个还原点并中止执行。

更好的想法?


NSObject 的实现[super init]永远不会返回零。基本实现只返回 self.

一般来说,初始化程序返回 nil 的唯一原因是发生非致命错误。例如,您可能已经调用-initWithContentsOfURL:error:并传递了无效的 URL。按照惯例,可能以这种方式失败的方法有一个error:参数,其中包含有关故障的信息。大多数初始化器都不可能出现可恢复的错误,因此像 NSObject 一样,它们永远不会返回 nil。

致命错误通常会引发异常或中止程序。所以检查 nil 对他们没有帮助。处理致命错误的最佳选择是NSSetUncaughtExceptionHandler,尽管您应该意识到,在发生致命错误的情况下保存数据是有风险的,因为未保存的数据可能会被损坏。在这种情况下,不要覆盖好的数据。

为什么 Objective-C 代码总是检查nil在初始化器中,即使 super 永远不会返回 nil?主要是惯例。可以说,通过始终检查 nil,超类将来添加失败条件变得更容易,而无需更改子类,但实际上这只是一个约定。

最后,初始化器不是检查超类初始化器是否失败的正确位置。如果可能出现可恢复的错误,调用者应该检查错误。

Example:

NSError *error;
FooClass *myFoo = [[FooClass alloc] initWithContentsOfURL:blah error:&error]
if (myFoo == nil) {
  // ...
} else {
  // ...
}

每当初始化一个对象时检查 nil 就太过分了。仅当存在以下情况时才需要执行此操作error:参数,或者该方法有记录的可恢复错误。

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

如果 [super init] 返回 nil 该怎么办? 的相关文章

  • 如何在 Objective C 中使用 swift 文件

    我想在 Objective C 代码中使用我的 Swift 文件 我找到了不同的链接 说明了如何操作 我的项目名称是 测试项目 我将 import Test Project Swift h 导入到我的 m 文件中 以在 Objective
  • AUGraphInitialize添加kAudioUnitSubType_Reverb2到AUGraph时出现错误代码-10868

    我正在尝试添加 AudioUnit 类型kAudioUnitSubType Reverb2 to an AUGraph我得到了 10868 kAudioUnitErr FormatNotSupported 支持的错误AUGraphIniti
  • 将小箭头添加到 iPhone TableView 单元格中单元格的右侧

    这应该很简单 我有一个带有 TableView 的 iPhone 应用程序 如何将经典的小箭头添加到每个单元格的右侧 只需设置相应的附件类型的财产UITableViewCell cell accessoryType UITableViewC
  • UITableView 最后一个单元格被 UITabBarController 隐藏

    我面临一个奇怪的问题 我有一个UITableView在最初的UIViewController of the UITabBarController 起初一切都很好 但是当我更改选项卡并返回到第一个选项卡时 最后一个单元格UITableView
  • 错误域=NSURLErrorDomain代码=-1017“该操作无法

    我刚刚开始 ios 开发 我正在尝试与我的 api 交换数据 当我执行 POST 请求时 一切正常 但当我尝试执行 GET 请求时 出现以下错误 错误域 NSURLErrorDomain代码 1017 该操作无法 完全的 NSURLErro
  • GCD 和线程

    我想了解一些有关 GCD 和线程的知识 我的视图控制器中有一个 for 循环 它要求我的模型执行一些异步网络请求 因此 如果循环运行 5 次 模型将发出 5 个网络请求 考虑到我正在使用 NSURLConnection 的 sendAsyn
  • 如何将 UIPopoverPresentationController 的高度设置为与 UITableView 相同

    我在我的应用程序上使用 UIPopoverPresentationController 在我的 iPhone 上显示弹出窗口 使用 UIModalPresentationNone 我希望尺寸随着 UITableView 的高度而动态变化 但
  • 方向改变时重新定位控件

    我知道自动布局可用于在方向改变时使尺寸和位置保持一致 当方向改变时 是否可以完全改变布局 例如 请查看下面的纵向模式下简单登录屏幕的线框 现在 如果我旋转设备 我想完全重新定位控件 这种事情可以用自动布局来完成吗 如果没有 我该怎么办 谢谢
  • 如何在 UITableView 中显示零行的表格

    我正在动态地将内容加载到 UITableView 中 如果有数据 表格需要显示数据 如果没有数据 表格应显示普通页面 但在我的应用程序中 表格显示带有两条分隔线的普通页面 我需要删除此分隔线并显示纯白色页面 请建议 任何帮助 将不胜感激 如
  • Swift 相当于 Objective-C FourCharCode 单引号文字(例如 'TEXT')

    我正在尝试在 Swift 中复制一些 Objective C cocoa 一切都很好 直到我遇到以下情况 Set a new type and creator unsigned long type TEXT unsigned long cr
  • NSCalendar 返回明年第一周上周一的错误日期

    我使用下面的代码使用随机日期来计算上周一 哪个工作文件但我的代码在明年日期中断 下面是相同的代码 NSDate date NSDate dateWithTimeIntervalSince1970 1483620311 228 NSLog c
  • 如果您使用 CocoaPods,您的 .gitignore 中会包含什么内容?

    我从事 iOS 开发已经几个月了 刚刚了解到有前途的可可豆荚 http cocoapods org 用于依赖管理的库 我在个人项目上尝试过 添加了依赖项Kiwi https github com allending Kiwi到我的 Podf
  • NSCFData isRessized 崩溃?

    我目前在控制台中收到此崩溃日志 2011 08 23 19 18 40 064 App 1697 707 NSCFData isResizable unrecognized selector sent to instance 0x11f1c
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc
  • 为什么在 init 方法中使用双括号,或者是 1 == (1)?

    评估某些含义时括号有什么作用 我在代码中遇到过这个问题 当检查某些内容并且他们使用 if some condition that returns 1 code 所以我的问题是 这是否正确 我认为它总是错误的 因为 1 不返回任何东西 编辑
  • NSUInteger 的奇怪行为 - 无法正确转换为浮动

    这是我的情况 这让我发疯 我有一个计数值为 517 的 NSMutableArray 我有一个双精度值 它是我的乘数 double multiplier 0 1223 double result myArray count multipli
  • iOS:生成pdf时绘制文本时如何设置字体?

    我在ios应用程序中使用drawpdf函数生成pdf 同时调用nsobject类中的drawtext函数 它根据我指定的框架和字符串清楚地绘制文本 我的代码是 void drawText NSString textToDraw inFram
  • “预期的 ';'在 Swift 下的顶级声明符之后”

    我正在尝试将所有颜色设置在一个 Swift 文件中 该文件可以在我的整个应用程序中使用 下面的代码会导致 import Foundation import UIKit class DotColors let tsblueColor UICo
  • UIPickerView selectRow 未按预期工作

    我创建了一个UIPickerView它有两个组件 第一个组件 A 的行数固定为 13 另一个组件 B 的行数可变 具体取决于 A 中选择的行 加载时UIPickerView我调用以下命令 以便我可以在两个组件中默认选择 但是我遇到的问题是只
  • 如何在 UICollectionView 中将行居中?

    我有一个UICollectionView与随机细胞 有什么方法可以让我将行居中吗 默认情况下它是这样的 x x x x x x x x x x x x x x 这是所需的布局 x x x x x x x x x x x x 我必须做这样的事

随机推荐

  • 如何渲染 svg 文件的*部分*?

    我想按名称渲染 svg 文件的一部分 但我一生都不知道如何做到这一点 使用 python gtk 这是有问题的 svg 文件 http david bellot free fr svg cards files SVG cards 2 0 1
  • 当使用 CSS 过渡/动画/等时,如果用户浏览器不执行 CSS 动画,那么回退到 jquery 的最佳方法是什么?

    我正在寻找一种使用 css 动画的方法 但如果用户浏览器不执行 css 动画 然后回退到使用 Jquery 进行动画 在 Jquery 中是否有一种简单的方法可以做到这一点 如果可能的话 一个插件就可以了 如果它是一个小插件 但我真的在寻找
  • 将所有变体都实现相同特征的枚举转换为 Rust 中的框?

    我有一个特质Foo 以及一些实现 以及枚举Foos每个实现有一个变体 我希望能够将我的枚举转换为Box
  • Windows Azure MessageLockLostException

    我在使用 Azure 消息总线队列时遇到问题 我有MessageLockLostException抛出和请求操作未在指定的超时 00 01 10 内完成 分配给此操作的时间可能是较长超时的一部分 我已将队列设置为ReceiveMode Pe
  • 为什么 C# 限制可以声明为 const 的类型集?

    编译错误CS0283表示只有基本 POD 类型 以及字符串 枚举和空引用 可以声明为const 有人对这种限制的基本原理有理论吗 例如 如果能够声明其他类型的 const 值 例如 IntPtr 那就太好了 我相信这个概念const实际上是
  • 定义渐变/形状/角的 XML 父样式

    如何在 XML 中定义可轻松重用的基本形状 或渐变或角 我有十几个左右的可绘制渐变 除了开始和结束颜色之外 它们都是相同的 我希望在其他地方定义相同的内容 并为每个不同的渐变创建一个仅定义开始和结束颜色的 XML 文件 那可能吗 这是基础
  • Python中反引号字符的含义

    我刚刚开始使用 python 有人可以解释以下代码片段的第 2 行吗 我不明白 num 少量 我尝试用单个勾号替换反引号字符 但随后它就破裂了 只要对该行进行详细解释就太好了 loop count 1000000 irn join num
  • 在单个操作上启用多个 HTTP 方法?

    我有一个操作合同 如下 我想允许对其进行 GET 和 POST 请求 我怎样才能告诉WCF接受单个OperationContract的两种类型的请求 OperationContract WebInvoke Method POST BodyS
  • 允许对 web.config 中的单个文件夹进行匿名身份验证吗?

    场景如下 我有一个使用自定义身份验证和成员资格提供程序的 Asp Net 应用程序 但我们需要允许完全匿名访问 即 应用程序中的特定文件夹 在IIS管理器中 您可以设置文件夹的身份验证模式 但设置保存在C Windows System32
  • 验证 ASP.NET MVC 中的字符串数组

    我使用 ASP NET MVC 如何验证视图模型中的字符串数组 因为 Required 属性不适用于字符串数组 DisplayName Content Name Required ErrorMessage Content name is r
  • 请求的资源上不存在“Access-Control-Allow-Origin”标头 + 响应的 HTTP 状态代码为 401

    XMLHttpRequest 无法加载http 192 168 1 253 8080 不 请求中存在 Access Control Allow Origin 标头 资源 起源 http 本地主机 4200 因此不允许 使用权 响应的 HTT
  • 如何在使用 bash 脚本初始化的 java 应用程序中捕获信号

    我使用以下代码在 java 中捕获 INT 信号 Signal handle new Signal INT new SignalHandler public void handle Signal sig log warn Received
  • 如何以编程方式关闭 Android Spinner 下拉列表

    我有一个场景 我在我的应用程序中使用微调器 制作的微调器下拉列表可以使用 performclick 方法直接打开 下拉列表打开 有没有一种方法可以自动关闭它或自动单击下拉列表中的项目 以便关闭下拉列表 Borg8 的答案是唯一有效的解决方案
  • 如何将 Windows 身份验证和 JWT 与 .Net Core 2.1 结合起来

    我尝试将 Windows 身份验证和 JWT 与 NET Core 2 1 一起使用 我有以下身份验证启动设置 services AddAuthentication options gt options DefaultAuthenticat
  • Flash中的循环缓冲区

    我需要将不同长度的项目存储在闪存芯片的循环队列中 每个项目都有其封装 这样我就可以弄清楚它有多大以及下一个项目从哪里开始 当缓冲区中有足够的项目时 它将换行到开头 在闪存芯片中存储循环队列的好方法是什么 我可能想存储数以万计的物品 因此 从
  • 如何配置xampp发送电子邮件

    我知道这是网站上的其他地方 但由于某种原因 我在这里找到的答案仍然没有帮助 在尝试了一整天不同的事情后 我仍然无法让它工作 我的目标是将确认码发送到用户输入的电子邮件中 我只了解少量的 PHP 并遵循了登录 注册系统的教程 但我相当确定 p
  • 使表格单元格中的链接填充整个行高

    我有一个数据表 每个单元格都是一个链接 我想允许用户单击表格单元格中的任意位置并让他们点击链接 有时表格单元格不止一行 但并非总是如此 我使用 td a display block 来获取覆盖大部分单元格的链接 当一行中的一个单元格为两行而
  • 为什么子类已经重写了父类的静态方法?

    当静态方法在子类中被重写时 我对静态方法的行为感到困惑 下面是代码 public class SuperClass public static void staticMethod System out println SuperClass
  • 从 LightGBM 模型访问树和节点

    在sci kit learn中 可以访问整个树结构 即树的每个节点 这允许探索树的每个分割所使用的属性以及用于测试的值 The binary tree structure has 5 nodes and has the following
  • 如果 [super init] 返回 nil 该怎么办?

    以下面代码为例 id init self super init if self code return self 我不希望 nil 向上传播调用层次结构 我最初的想法是在 self 为零的情况下抛出异常 创建一个还原点并中止执行 更好的想法