问题我想问个究竟时,一个非void方法达到最终没有回报?
环境此问题与iOS
和有关Objective-C
。我不确定这个问题中描述的事物在其他地方的表现。
介绍和背景
通常,当您在Objective-C中声明非空方法并且未指定时return
,Xcode会显示编译错误
Control reaches end of non-void function
并且除非您解决此问题,否则禁止您进行编译。
该系统可以非常聪明地检测您的代码是否可以或不能到达非空函数的末尾-识别您的if / else块是否满足所有选项,通过开关等。
但是,我发现了一种(甚至可能还有其他)大脑编译器的想法,他们认为“嘿,伙计,这段代码看起来很好,让我们编译一下,尽情享受吧!”。这是偶然的,造成了一些头痛。这是代码!
代码
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;
}
}
结果
使用此代码,编译器认为可以编译该方法是可以的,因为嘿,其中有一个switch对象是一个枚举,并且每种情况下都有一个可能的枚举值,是的,听起来合法。 。
所以我真的很感兴趣,既然编译器感到困惑,那么让我把这个错误的代码运行到最后会发生什么呢?
错误
对于任何有兴趣的人,我的错误是在(eSections)@(localSection)
,而不是输入localSection
我键入的eSections @(localSection)
,而是将其编译为a NSNumber
,而不是使用该对象的指针的值,因此无法与任何the匹配case
,因为指针可能会很长(而且很可能不是0、1或2)。接下来发生的事情是该项目试图为大量单元分配空间(我认为未指定返回值就像让我们在其中抛出一些内存值之类的东西),最终导致应用程序因内存压力而崩溃。
感谢所有答案!
结果是未定义的行为。
通常,调用者会得到未指定的垃圾作为返回值。调用者获取的内容是寄存器中留下的任何内容,或者在某些情况下,调用者为局部变量使用的某些堆栈位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句