xcode 5 什么是警告,现在是错误 - 控制可能到达非空函数的末尾

2024-01-03

所以我一直在 Xcode4 中开发一个具有多个集合视图(准确地说是 4 个)的应用程序

我有两个视图,一个底部“主”视图,其中包含一个充满屏幕的大型集合视图,以及一个较小的“抽屉”视图,可以从侧面拉出,并包含三个狭窄的水平滚动集合视图,一个堆叠在另一个的顶部。

我一直在使用标签和 if 语句填充单元格cellforitematpath方法。在 xcode 4 中,以及我在 xcode 4 中创建的项目,现在在 xcode 5 中打开,这是有效的。我在底部收到一条警告(不是错误),上面写着control may reach end of non void function,但我仍然能够构建和运行并且它可以工作。

在 xcode 5 的一个新项目中,相同的代码显示“控制可能到达非空函数的末尾”作为错误,并且不允许构建和运行。这令人无限沮丧。我不想返回单元格,除非有一个数组要填充单元格。我什至不知道“return nil”是什么意思。有人对如何关闭此功能有任何建议吗?

以下绝对不漂亮,请自行承担风险:

- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView
                   cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (collectionView.tag == 0){
        static NSString *CellIdentifier = @"subjectCell";
        SubjectCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

        AHSubject *cellSubject = [self.subjectsArray objectAtIndex:indexPath.row];

        [[cell subjectLabel]setText:cellSubject.name];

        return cell;
    }
    else if (collectionView.tag == 1){
        if ([categoryArray count] > 0) {
            static NSString *CellIdentifier = @"categoryCell";
            CategoryCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

            AHCategory *cellCategory = [categoryArray objectAtIndex:indexPath.row];

            [[cell categoryLabel]setText:cellCategory.name];

            return cell;
        }
    }
    else if (collectionView.tag == 2){
        if ([subcategoryArray count] > 0) {
            static NSString *CellIdentifier = @"subcategoryCell";
            GroupCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

            AHCardGroup *cellSubcategory = [subcategoryArray objectAtIndex:indexPath.row];

            [[cell subcategoryLabel]setText:cellSubcategory.name];

            return cell;
        }
    }
    else {
        if ([cardArray count] > 0) {
            static NSString *CellIdentifier = @"cardCell";
            CardCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

            AHCard *cellCard = [cardArray objectAtIndex:indexPath.row];

            [[cell frontLabel]setText:cellCard.front];

            return cell;
        }
    }
    // return nil;
}

只需取消注释即可return nil,一切都会好起来的。因为你的最后else处理所有情况,代码永远达不到那个return nil,但 Xcode 的分析器显然不够聪明,无法知道这一点。

编辑:此设置可以在“Apple LLVM 5.0 - 警告 - 所有语言”下的“构建设置”中找到。它属于“不匹配的返回类型”,过去默认为“是”,现在默认为“是”(视为错误)。您可以更改此设置以将其改回警告。但我不会那样做。只需取消注释您的return nil没关系。

我想指出的是,到达非 void 函数的末尾而不返回值是一个错误,并且很可能导致崩溃,而返回 nil (例如)可能不会。考虑以下简单示例:

- (NSString*) someString
{
    return nil;
}

// ... someplace elsewhere in the code:
NSString* aString = [self someString];
NSLog( @"aString = %@", aString );

这很好,你的输出将类似于:

返回了一个东西(空)

现在,如果您注释掉该返回,则:

- (NSString*) someString
{
    // return nil;
}

// ... someplace elsewhere in the code:
NSString* aString = [self someString];
NSLog( @"aString = %@", aString );

NSLog 调用将取消引用某些随机内存位置(我认为无论堆栈上发生了什么),您的应用程序几乎肯定会崩溃。

如果您有一个返回某种类型值的函数,那么它必须始终返回该类型的值。

Edit2(回应@Dave DeLong的评论): 好点,回来了nil from collectionView:cellForItemAtIndexPath: is一个错误,但我可能会认为,与简单地让函数在没有返回值的情况下结束相比,这是一个不太严重的错误。事实证明有点学术性,因为OP的代码是最终的return nil无论如何,永远不会执行。

人们可以重写该函数,以避免出现警告并键入“return nil”,因此:

- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView    cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    id cell = nil;

    if (collectionView.tag == 0) {
        // Make a Subject cell
    }
    else if (collectionView.tag == 1) {
        // Make a Category cell.
    }
    else {
        // Make a Card cell.
    } 

    return cell;
}

...但最终结果与OP的原始代码相同(带有return nil未注释):该函数可以但不会返回 nil。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xcode 5 什么是警告,现在是错误 - 控制可能到达非空函数的末尾 的相关文章

随机推荐

  • 组织议程正则表达式搜索类别

    我喜欢使用以下方式构建我的组织模式项目 CATEGORY 财产 但类别似乎不被认可org agenda filter by regexp 势必 当查看相当大的 TODO 项目列表时 能够将列表缩小到匹配的类别会很有帮助 我知道我可以使用or
  • 为什么队列没有实现 len() ?

    内置功能len https docs python org 3 library functions html len https docs python org 3 library functions html len 返回 对象的长度 项
  • 如何生成 8 位唯一标识符来替换 python pandas 中的现有标识符

    假设我有以下简单的数据框 但实际上 我有数十万行这样的行 df ID Sales 倀 譋 理 100 倀 50 倀 譋 理 70 躥 60 我的想法是我想用随机生成的 8 位数字替换中文数字 如下所示 ID Sales 13434535 1
  • 将添加了叠加层的照片保存到照片库

    我正在制作一个应用程序 用户可以在其中拍照 在图像上放置叠加层 然后用户可以保存图像或将其上传到 Facebook 或其他网站 我已经设法让应用程序拍照 并制作我正在使用的叠加层UIImageView 它被放置在照片的顶部 我不确定如何将带
  • Rails 数据库设计:使用字符串还是整数?

    假设我有一个 Rails 表 其中包含从一组选项中选择的信息 例如 一个名为sex可能是Male or Female 一个名为Bodytype将是slim curvy ETC 我的问题是 将这些值存储为整数或字符串更好的做法是什么 当然 在
  • 为什么将 main 声明为数组会编译?

    I saw CodeGolf 上的一段代码 https codegolf stackexchange com a 69193 13441这是一个编译器炸弹 其中main被声明为一个巨大的数组 我尝试了以下 非炸弹 版本 int main 1
  • ToolTip 与 Popup(WPF 控件)

    这些 WPF 控件之间的主要区别是什么 当我应该使用ToolTip代替Popup A ToolTip是一个小弹出窗口 当用户将鼠标指针悬停在元素上时出现 这Popup控件提供了一种在单独的窗口中显示内容的方法 该窗口相对于指定的元素或屏幕坐
  • 桌面上的innerWidth 和outerWidth 奇怪

    在 chrome 中打开控制台 在 SO 上 并复制innerWidth outerWidth screen width 对我来说这会返回2133 1920 1920 显然innerWidth大于outerWidth 好像这还不够奇怪 我接
  • 猫鼬游标批量大小

    如果定义了batchSize 如何迭代光标批处理文档 例如 当batchSize定义为等于50时 有没有办法迭代这50个子文档 var myCursor collection find cursor batchSize 50 mycurso
  • 多处理:如何在多个进程之间共享字典?

    创建多个在可连接队列上工作的进程的程序 Q 并可能最终操纵一个全局字典D来存储结果 所以每个子进程可以使用D存储其结果并查看其他子进程正在产生什么结果 如果我在子进程中打印字典 D 我会看到对其 即 D 上 所做的修改 但是主进程加入Q后
  • 接收 JSON POST [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 php 中获取 POST 的正文 https stackoverflow com questions 8945879 how to get body of a post in php 我收到一
  • 如何使我的 R 会话变得普通?

    这是澄清先前问题的后续行动 如何确保同一服务器上不同用户的 R 环境一致 https stackoverflow com questions 12519273 how can i ensure a consistent r environm
  • 我的类的构造函数应该执行多少工作?

    我有一个代表数据流的类 它基本上 读取或写入文件 但首先对数据进行加密 解密 并且还有一个处理正在访问的媒体的底层编解码器对象 我正在尝试以 RAII 方式编写这个类 并且我想要一个干净 漂亮 可用的设计 令我困扰的是 现在构造函数中正在完
  • 我什么时候应该对整个哈希表进行重新哈希?

    我如何决定何时应该对整个哈希表进行重新哈希 这在很大程度上取决于您解决冲突的方式 如果您使用线性探测 负载系数远高于 60 左右时 性能通常会开始严重下降 如果您使用双散列 80 85 的负载因子通常是相当合理的 如果使用碰撞链 负载系数高
  • Java EE FirebaseApp 名称 [默认] 已存在

    我遇到了与 Firebase 和 Java EE 相关的问题 我目前正在为我的项目编写一些 Java servlet 并且我第一次使用 Firebase 是因为我想尝试一些新的东西 我的实际问题如下 我有一个 servlet 它负责在用户数
  • Android 从字符串数组中设置 listItem 背景颜色

    有谁知道如何以编程方式从字符串数组中设置列表项的背景 我有两个字符串数组 一个是文本视图的标题 另一个包含颜色引用 我已将标题数组添加到数组适配器中 并且正在显示 但现在我想更改数组中每个项目的背景颜色 这是我的布局
  • 多个 id 的 UpdateExistingPivot

    为了更新数据透视表中的单个记录 我使用updateExistingPivot方法 但是它以 id 作为第一个参数 例如 step gt contacts gt updateExistingPivot id completed gt true
  • 如何使 Collection 类型的用户控件属性在表单设计器中可编辑?

    今天在工作中 我偶然发现了一个让我抓狂的问题 基本上我的目标是这样的 我有一个UserControl1 具有以下类型的字段Collection
  • 安装airflow时,airflow_home文件夹中没有创建任何文件

    我之前在VMware中centos7安装成功 不过同样的 在docker中从centos7手动安装也出现了问题 CentOS 的官方版本 venv jykim 0f0090962efa dev cat etc release CentOS
  • xcode 5 什么是警告,现在是错误 - 控制可能到达非空函数的末尾

    所以我一直在 Xcode4 中开发一个具有多个集合视图 准确地说是 4 个 的应用程序 我有两个视图 一个底部 主 视图 其中包含一个充满屏幕的大型集合视图 以及一个较小的 抽屉 视图 可以从侧面拉出 并包含三个狭窄的水平滚动集合视图 一个