当非void方法在Objective-C中达到终点时会发生什么?

迅速地

问题我想问个究竟时,一个非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)。接下来发生的事情是该项目试图为大量单元分配空间(我认为未指定返回就像让我们在其中抛出一些内存值之类的东西),最终导致应用程序因内存压力而崩溃。

感谢所有答案!

肯·托马斯(Ken Thomases)

结果是未定义的行为。

通常,调用者会得到未指定的垃圾作为返回值。调用者获取的内容是寄存器中留下的任何内容,或者在某些情况下,调用者为局部变量使用的某些堆栈位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当非void方法在Objective-C中达到终点时会发生什么?

来自分类Dev

为什么Web服务中的方法在C#中返回Arraylist时会发生异常?

来自分类Dev

当非购买者在iOS中按下“恢复购买”按钮时会发生什么?

来自分类Dev

在 Swift 中,当两个线程获取并设置非线程安全属性时会发生什么?

来自分类Dev

在方法中枚举静态变量并将其设置为null时会发生什么

来自分类Dev

使用Java中的main方法为类创建对象时会发生什么

来自分类Dev

当线程进入Java中的同步块/方法时会发生什么情况

来自分类Dev

将属性应用于python中的类方法时会发生什么情况?

来自分类Dev

在Flash ActionScript中调用不存在的方法时会发生什么?

来自分类Dev

在方法中枚举静态变量并将其设置为null时会发生什么

来自分类Dev

在方法中两次调用递归时会发生什么?

来自分类Dev

当您移到非右值参考时会发生什么?

来自分类Dev

从中调用Overridden方法时会发生什么?

来自分类Dev

当Java中有多个main方法时会发生什么?

来自分类Dev

当方法调用自身的return语句时会发生什么?递归。

来自分类Dev

NodeJs当next()方法上的Token正确时会发生什么?

来自分类Dev

达到墓碑限制时会发生什么

来自分类Dev

达到墓碑限制时会发生什么

来自分类Dev

当线程尝试同时调用静态和非静态同步方法时会发生什么?

来自分类Dev

RabbitMQ Java客户端:当在使用者的handleDelivery()方法中抛出RuntimeException时会发生什么情况?

来自分类Dev

C#对Objective-C的绑定:@属性(强,非原子)void(^ animations)(void);

来自分类Dev

将非关联数组传递给json_encode()时会发生什么?

来自分类Dev

当非root用户向root用户的进程发送信号时会发生什么?

来自分类Dev

当您从非AD帐户调用UserPrincipal.Current.GivenName时会发生什么?

来自分类Dev

当EventLogEntry.Index达到MaxInt时会发生什么?

来自分类Dev

在C ++标准中,当违反“应”要求时会发生什么?

来自分类Dev

在 C++ 中为对象赋值时会发生什么

来自分类Dev

当我在Amazon S3中将Quiet设置为true以便在deleteObjects()方法中启用安静模式时会发生什么情况?

来自分类Dev

方法名称和块名称相同时会发生什么?

Related 相关文章

  1. 1

    当非void方法在Objective-C中达到终点时会发生什么?

  2. 2

    为什么Web服务中的方法在C#中返回Arraylist时会发生异常?

  3. 3

    当非购买者在iOS中按下“恢复购买”按钮时会发生什么?

  4. 4

    在 Swift 中,当两个线程获取并设置非线程安全属性时会发生什么?

  5. 5

    在方法中枚举静态变量并将其设置为null时会发生什么

  6. 6

    使用Java中的main方法为类创建对象时会发生什么

  7. 7

    当线程进入Java中的同步块/方法时会发生什么情况

  8. 8

    将属性应用于python中的类方法时会发生什么情况?

  9. 9

    在Flash ActionScript中调用不存在的方法时会发生什么?

  10. 10

    在方法中枚举静态变量并将其设置为null时会发生什么

  11. 11

    在方法中两次调用递归时会发生什么?

  12. 12

    当您移到非右值参考时会发生什么?

  13. 13

    从中调用Overridden方法时会发生什么?

  14. 14

    当Java中有多个main方法时会发生什么?

  15. 15

    当方法调用自身的return语句时会发生什么?递归。

  16. 16

    NodeJs当next()方法上的Token正确时会发生什么?

  17. 17

    达到墓碑限制时会发生什么

  18. 18

    达到墓碑限制时会发生什么

  19. 19

    当线程尝试同时调用静态和非静态同步方法时会发生什么?

  20. 20

    RabbitMQ Java客户端:当在使用者的handleDelivery()方法中抛出RuntimeException时会发生什么情况?

  21. 21

    C#对Objective-C的绑定:@属性(强,非原子)void(^ animations)(void);

  22. 22

    将非关联数组传递给json_encode()时会发生什么?

  23. 23

    当非root用户向root用户的进程发送信号时会发生什么?

  24. 24

    当您从非AD帐户调用UserPrincipal.Current.GivenName时会发生什么?

  25. 25

    当EventLogEntry.Index达到MaxInt时会发生什么?

  26. 26

    在C ++标准中,当违反“应”要求时会发生什么?

  27. 27

    在 C++ 中为对象赋值时会发生什么

  28. 28

    当我在Amazon S3中将Quiet设置为true以便在deleteObjects()方法中启用安静模式时会发生什么情况?

  29. 29

    方法名称和块名称相同时会发生什么?

热门标签

归档