Objective-C中try catch捕获异常后方法返回调用者实例问题
Objective-C 异常捕获场景下返回异常值的底层逻辑
这是Objective-C方法调用约定与未明确指定返回值共同导致的未定义行为,并非语言设计的主动逻辑,具体运行规则如下:
- Objective-C的实例方法本质是带两个隐式参数的C函数,两个参数分别为当前实例
self、方法选择子_cmd。按照ARM64架构的函数调用约定,第一个入参、函数返回值都会复用x0寄存器:方法调用时x0会先存入调用者传入的self值,方法执行return时会把返回值写入x0再退出,外部调用方会读取x0的值作为方法返回结果。 - 你提供的代码中,
testMethod的@try块抛出异常后,后续的return @"normal return"语句永远不会执行;@catch块捕获异常后没有编写任何return语句,走完@catch、@finally逻辑后方法直接退出,全程没有修改过x0寄存器的值,因此x0里保留的还是方法刚调用时存入的self(即AppDelegate实例),外部调用方就会把这个self值当成方法的返回值读取。 - 该表现完全不可靠,属于未定义行为:如果
@catch或者@finally块中执行了其他方法调用、变量赋值等操作修改了x0寄存器的值,返回值会变成不可预测的内容,极端情况下会直接触发崩溃,绝对不能依赖该特性做业务逻辑。 - 正确写法:只要方法声明了非
void返回值,所有代码执行路径都必须明确指定返回值。你如果期望捕获异常后返回nil,直接在@catch块中添加return nil;即可。
内容的提问来源于stack exchange,提问作者childrenOurFuture
相关产品推荐
相关产品推荐

