gpt4 book ai didi

ios - 当非 void 方法在 Objective-C 中结束时会发生什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:14:52 25 4
gpt4 key购买 nike

问题 请问非void方法到达end没有return时会发生什么情况?

环境 这个问题与iOSObjective-C 有关。我不确定这个问题中描述的事情在其他地方的表现如何。


简介和背景

通常,当您在 Objective-C 中声明一个非 void 方法并且没有指定 return 时,Xcode 会显示编译错误

控件到达非 void 函数的结尾

并禁止您编译,除非您解决此问题。

系统可以非常智能地检测您的代码是否可以或不能到达非 void 函数的结尾 - 识别您的 if/else block 是否满足所有选项,通过开关等。

但是,我发现了一个(可能还有其他的)选项,可以让编译器思考“嘿伙计,是的,这段代码看起来非常好,让我们编译它并享受乐趣吧! ”。这是一个意外,引起了一些头痛。这是代码!

代码

typedef enum eSections { eSectionRecent, eSectionAround, eSectionAll } eSections;

...

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger localSection = section;
if (numberOfSections == 2) localSection++;

switch ((eSections)@(localSection))
{
case eSectionRecent:
return 1;
break;
case eSectionAround:
return 1;
break;
case eSectionAll:
return 3;
break;
}
}

结果

有了这段代码,编译器认为可以让这个方法编译,因为嘿,开关对象是一个枚举,每个都有一个案例可能的枚举值,所以,是的,这听起来不错 ...

所以我真的很感兴趣,现在编译器感到困惑并让我运行这个错误代码到底发生了什么?

错误

对于任何感兴趣的人,我的错误是在 (eSections)@(localSection) 中,我没有在 eSections 中输入 localSection,而是输入了 @(localSection),它编译成一个 NSNumber 并且使用指向对象的指针而不是值,因此无法与任何 case 匹配,因为指针可以是相当长(很可能不是 0、1 或 2)。接下来发生的事情是,该项目试图为大量单元格分配空间(我认为不指定返回值就像是让我们在那里丢一些内存值)并最终使应用程序崩溃内存压力。

谢谢大家的回答!

最佳答案

结果是未定义的行为。

通常,调用者会得到未指定的垃圾作为返回值。无论寄存器中剩下什么,或者在某些情况下,调用者为局部变量使用的一些堆栈位置,都是调用者得到的。

关于ios - 当非 void 方法在 Objective-C 中结束时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com