问题我想问一下当非空方法到达而没有返回时会发生什么?
环境此问题与iOS
和Objective-C
有关。我不确定这个问题中描述的内容在其他地方是如何表现的。
简介和背景
通常,当你在Objective-C中声明一个非void方法而你没有指定return
时,Xcode会显示编译错误
Control reaches end of non-void function
并禁止您编译,除非您解决此问题。
系统可以非常智能地检测您的代码是否能够或无法达到非空函数的结束 - 识别您的if / else块是否满足所有选项,通过交换机等。
然而,我发现了一个(并且可能有其他的,真的)脑力的选项让编译器思考并且#34;嘿伙伴,是的,这段代码看起来非常好,让&# 39; s编译它并玩得开心!"。这是偶然的,并引起了一些头痛。这是代码!
守则
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;
}
}
结果
使用这段代码,编译器认为可以让这个方法编译,因为嘿,那里有一个enum的switch对象,每个可能的枚举值都有一个案例,所以,是的,这听起来合法 ......
所以我真的很感兴趣,现在发生什么事情让编译器感到困惑,让我把这个错误的代码运行到最后?
错误
对于任何感兴趣的人,我的错误都在(eSections)@(localSection)
,而不是在eSections中键入localSection
,而是键入@(localSection)
,而不是值NSNumber
使用指向对象的指针,因此无法与任何case
匹配,因为指针可能很长(很可能不是0,1或2)。接下来发生的事情是该项目试图为非常多的单元格分配空间(我认为没有指定返回就像让它只是在那里抛出一些内存值)并最终崩溃了应用程序的内存压力。
感谢所有答案!
答案 0 :(得分:6)
结果是未定义的行为。
通常,调用者将未指定的垃圾作为返回值。无论寄存器中剩下什么,或者在某些情况下,调用者为局部变量使用的某些堆栈位置都是调用者得到的。