首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果[super init]返回nil,为什么不抛出异常?

[super init]返回nil时,不会抛出异常的原因是在于Objective-C的初始化方法遵循特定的规则。在Objective-C中,初始化方法遵循以下规则:

  1. 初始化方法应该以init开头。
  2. 初始化方法可以有一个或多个参数。
  3. 初始化方法应该返回一个指向已初始化对象的指针。
  4. 如果初始化成功,初始化方法应该返回已初始化对象的指针。如果初始化失败,应该返回nil
  5. 在初始化方法中,应该先调用父类的初始化方法,然后再执行子类的初始化操作。

在这个问题中,[super init]是在子类的初始化方法中调用父类的初始化方法。如果父类的初始化方法返回nil,则表示父类的初始化失败,此时子类的初始化方法应该立即返回nil,而不是抛出异常。这是因为在Objective-C中,初始化方法的调用者应该检查返回值,而不是捕获异常。如果初始化失败,调用者应该处理返回值为nil的情况,而不是假设对象已经成功初始化。

总之,[super init]返回nil时,不会抛出异常是因为Objective-C的初始化方法规则要求初始化方法的调用者检查返回值,而不是捕获异常。

相关搜索:为什么在遍历列表时不抛出并发修改异常?为什么python unittest assertRaises方法不注册抛出的异常?从WebApi返回自定义错误响应,不抛出异常为什么spark dataframe.take抛出异常不兼容的类型?如果Task<HttpResponseMessage>.IsCompleted为真,为什么Task<HttpResponseMessage>.Result会抛出异常?如果没有抛出异常表明操作成功,则返回布尔值true如果更改返回值类型,为什么不更改页面如果x是list,为什么x + ="ha"可以工作,而x = x +"ha"会抛出异常?Play Framework:如果在JSON解析过程中抛出异常,则返回400的BodyParser为什么php decimal-ext会对错误的compareTo方法返回类型抛出异常?为什么TypeScript在返回隐式类型返回对象的无效属性时不抛出错误?为什么MediaPlayer.create在类的开头初始化时抛出NullPointer异常,而在OnCreate方法中初始化时不抛出呢?如何使axios在遇到HTTP302时不抛出异常,而是随它一起返回AxiosResponse?如果使用从方法返回的lambda,为什么事件取消订阅会起作用(“不泄漏”)?为什么我的函数不返回值,但如果我使用print就可以了?如果include_directories中的某个路径不存在,为什么CMakeLists不(在编译期间)抛出警告/错误?在执行plsql block返回查询结果时,如果没有找到DB.When数据中存在的数据,则查询结果不返回任何异常为什么在这种情况下我不能执行console.log,而在这里,如果我返回temps,为什么函数不工作?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • iOS进阶_KVC(&KVC赋值取值过程分析&KVC自定义&异常处理)

    判断是否可以直接访问成员变量 3、如果判断NO,直接执行KVC的setValue:forUndefinedKey:(系统抛出一个异常,未定义key) 4、如果是YES,继续找相关变量_ _is... is 5、方法或成员都不存在,setValue:forUndefinedKey:方法默认是抛出异常 实例验证 WTPerson.h #import <Foundation...NO,直接执行KVC的valueForUndefinedKey:(系统抛出一个异常,未定义key) 4、如果是YES,继续找相关变量_、_is、、is 5、方法或成员都不存在...,valueForUndefineKey:方法,默认是抛出异常 实例验证 WTPerson.m #import "WTPerson.h" @implementation WTPerson //- (...该方法的工作原理: 1、先找一下你的类中是否实现了方法 -(BOOL)validate:error; 2、如果实现了就会根据实现方法里面的自定义逻辑返回NO或者YES;如果没有实现这个方法

    83541

    消息转发

    ,那就出现了我们未能及时考虑到的情况,所以这种针对特定方法方法选择器动态添加方法实现的情况在实际开发中,并不常用到.如果在这个时机,我们未能对异常的方法进行处理,或者处理之后依旧返回了false,那么消息转发就会进入到下一个转发流程...]]; [anInvocation invokeWithTarget:[[Exception2 alloc] init]]; } @end 如果你错过了上述所有的时机,或者虽然处理了但是没有成功...,最终都会被系统捕获为异常进行抛出,从而导致应用闪退...消息转发机制的应用 了解了消息转发的实现之后,我们来探索一下消息转发机制的应用. 2.1 避免程序异常闪退,定位异常位置 无论你多么牛逼,实现中都会有一些莫名其妙的异常,而针对不能识别的这类异常,就可以利用消息转发机制在抛出异常之前对异常的方法进行转发处理...但是,但是,但是,其实我们只是拦截了实例方法未实现导致的异常如果是类方法未实现导致的异常,怎么处理呢?

    1.7K20

    面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    在 Objective-C 中向 nil 发送消息是完全有效的——只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。...如果方法返回值为结构体,发送给 nil 的消息将返回0。结构体中各个字段的值将都是0。 如果方法的返回值不是上述提到的几种情况,那么发送给 nil 的消息的返回值将是未定义的。...objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常...这也就是为什么说“推荐在 init 方法中使用点语法”,如果想访问实例变量 iVar 应该使用下划线( _iVar ),而非点语法( self.iVar )。...此时若使用点语法( self.lastName )也即 setter 设置方法,那么调用将会是子类的设置方法,如果在刚刚的 setter 代码中采用设置方法一,那么就会抛出异常, 为了方便采用打印的方式展示

    1K100

    2020-iOS最新面试题解析—1(原理篇)

    @implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"%@...,在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会...在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil) 如果方法返回值为指针类型,其指针大小为小于或者等于...sizeof(void*) float,double,long double 或者long long的整型标量,发送给nil的消息将返回0 如果方法返回值为结构体,发送给nil的消息将返回0。...,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 。

    1.7K21

    iOS理论基础(二)

    setter=一般用在特殊的情境下,比如: 在数据反序列化、转模型的过程中,服务器返回的字段如果init开头,所以你需要定义一个init开头的属性,但默认生成的setter与getter方法也会以init...用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么如果改用strong关键字,可能造成什么问题?...在 Objective-C 中向 nil 发送消息是完全有效的——只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。...如果方法返回值为结构体,发送给 nil 的消息将返回0。结构体中各个字段的值将都是0。 2. 如果方法的返回值不是上述提到的几种情况,那么发送给 nil 的消息的返回值将是未定义的。...objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常

    41510

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API兼容奔溃,模拟多继承)

    如果类的方法列表中找不到就到父类的方法列表中查找,一直找到NSObject类为止。 如果还是没找到就要开始进入动态方法解析和消息转发,后面会说。 其中,为什么它被称为 “转发”?...动态特性:方法解析和消息转发 没有方法的实现,程序会在运行时挂掉并抛出 unrecognized selector sent to … 的异常。...如果此方法返回的是nil 或者self,则会进入消息转发机制(- (void)forwardInvocation:(NSInvocation *)invocation),否则将会向返回的对象重新发送消息...所以重写forwardInvocation:的同时也要重写methodSignatureForSelector:方法,否则会抛出异常。...你可以发送 -invokeWithTarget: 消息来手动转发消息或者发送 -doesNotRecognizeSelector: 抛出异常

    2K11

    《Effective Objective-C 》干货三部曲(三):技巧篇

    第32条:编写“异常安全代码”时留意内存管理问题 在发生异常时的内存管理需要仔细考虑内存管理的问题: 在try块中,如果先保留了某个对象,然后在释放它之前又抛出异常,那么除非在catch块中能处理此问题...Oh well..."); } 这里,我们用release方法释放了try中的对象,但是这样做仍然有问题:如果在doSomthingThatMayThrow方法中抛出异常了呢?...在僵尸对象收到消息后,会抛出异常,它会说明发送过来的消息,也会描述回收之前的那个对象。...第39条:用handler块降低代码分散程度 下载网络数据时,如果使用代理方法,会使得代码分布紧凑,而且如果有多个下载任务的话,还要在回调的代理中判断当前请求的类型。...返回值只能是void或者对象类型。 但是如果将方法放在块中,通过GCD来操作就能很好地解决这些问题。

    75720

    《Effective Objective-C 》干货三部曲(三):技巧篇

    第32条:编写“异常安全代码”时留意内存管理问题 在发生异常时的内存管理需要仔细考虑内存管理的问题: 在try块中,如果先保留了某个对象,然后在释放它之前又抛出异常,那么除非在catch块中能处理此问题...Oh well..."); } 这里,我们用release方法释放了try中的对象,但是这样做仍然有问题:如果在doSomthingThatMayThrow方法中抛出异常了呢?...在僵尸对象收到消息后,会抛出异常,它会说明发送过来的消息,也会描述回收之前的那个对象。...第39条:用handler块降低代码分散程度 下载网络数据时,如果使用代理方法,会使得代码分布紧凑,而且如果有多个下载任务的话,还要在回调的代理中判断当前请求的类型。...返回值只能是void或者对象类型。 但是如果将方法放在块中,通过GCD来操作就能很好地解决这些问题。

    73510

    iOS_单元测试三之OCMock使用

    7.5、按顺序验证 Verifying in order 一旦调用了不在“预期列表”中的下一个方法,模拟就会快速失败并抛出异常。...]); 在这种情况下,模拟将接受所有方法,除了mo_className,如果调用该函数,则将引发异常。...9.2、重新验证失败后快速抛出异常 Re-throwing fail fast exceptions in verify all 在快速失败模式下,异常可能不会导致测试失败(如:当方法的调用堆栈未在测试中结束时...如果仔细协调,可能会导致意外行为或crash。...当开发人员尝试为此类创建模拟程序时,将引发异常,解释问题说在 该方法在单独调用中返回不同的值是可以接受的,这使它在运行时对特定条件做出反应 如果该方法为reason赋值,返回值将被忽略 对于所有未实现此方法的类

    3.2K20

    RunTime 之消息处理与消息转发

    根据文档,如果实现了添加函数代码则返回YES,未实现返回NO。如果没有添加函数代码就算返回YES,也无任何意义,还是会往下走。...B:返回的这个对象,如果也无法响应这个 SEL就会跟当前这个情形一样,会调用这个对象的resolveInstanceMethod 方法,如果未作处理也会帮抛出异常。...当该方法返回self或者nil, 说明不对相应的方法进行转发,那么就该走下一步了。...注意:如果 methodSignatureForSelector 返回的NSMethodSignature 是 nil 的话不会继续执行 forwardInvocation,转发流程终止,抛出无法处理的异常...调用这个方法如果不能处理就会调用父类的相关方法,一直到NSObject的这个方法,如果NSObject都无法处理就会调用doesNotRecognizeSelector:方法抛出异常

    69820

    alloc 、init、new详解

    为什么NSString的两次内存地址不一样?基础好的同学可能猜测到原因了。...//… } } 也就是说NSString在使用init初始化时,会调用[super init],如果不为nil,就重新分配内存空间,导致内存空间不一致,而NSObject就是根类,不存在superClass...如果要自定义这个实现方法.你必须调用 super 来先初始化父类的对象.如果这个新对象不能被初始化,这个方法就应该返回 nil.例如,假设有一个照相机相关的类,如果在一个没有照相机的设备上调用了这个类,...那么,在父类的 init 方法中就会返回 nil....结论: 重写 init 方法时需要先初始化父类的 init 方法. NSObject 中的 init 方法什么也没做,只是返回了自己而已. 如果初始化失败,会返回 nil. new 帮助文档: ?

    93530

    《Effective-Ruby》读书笔记

    第四章:异常 第 22 条:使用定制的异常而不是抛出字符串 避免使用字符串作为异常,它们会被转换成原生的 RuntimeError 对象。...如果你已经这么做了,就应该想想你真正想做的是不是可以通过 ensure 语句来实现 在异常发生的情况下,从 resuce 语句中抛出异常将会替换当前异常并离开当前的作用域 第 24 条:通过块和 ensure...永远不要无条件 retry,要把它看做代码中的隐式循环;在代码块的外围定义重试次数,当超出最大重试次数时重新抛出异常 retry 时记录具有审计作用的异常信息,如果重试有问题的代码解决不了问题,需要追根溯源地去了解异常是如何发生的...,强 Proc 对象会抛出 ArgumentError 异常 可以使用 Proc#arity 方法得到 Proc 期望的参数数量,如果返回的是正数,则意味着有多少参数是必须的。...如果希望调用者修改缓存的变量,那应该考虑让被记忆化的方法返回冻结对象。 先用工具分析程序的性能,再考虑是否需要记忆化。

    4K60
    领券