我们需要检查对象是否已经被分配吗?(关于IT技术的问题)

5
在我阅读的大部分Objective-C示例以及Objective-C文档中,使用对象之前总是会检查是否成功完成。
例如:
MyObject *myObject = [[MyObject alloc] init];
if (myObject){
    //do stuff with the object
}
//stuff beyond here is probably not going to work if myObject is nil

这不会影响对错误的追踪吗?我不确定为什么除了内存不足,分配会失败,但从来没有在Java(我正在迁移的语言)中看到过像这样在初始化对象后立即进行检查。
我想,如果您检查每个单独的分配并尝试对失败的分配做出反应,那么应用程序会变得非常复杂。我猜你可以在很多情况下向用户显示错误消息,但程序中的分支数可能会增加一倍。
但在我看到的示例中,当分配失败时,它们除了跳过一些必要的代码以使用户看到他们在屏幕上期望的内容外,不做任何事情。如果在实际使用中,分配失败确实经常发生,并且您遵循这种编码风格,那么结果可能是空白屏幕、用户认为已保存但未保存的文档、用户和程序员都不知道的损坏数据等等。
编辑:这里有一个来自苹果教程“Your Third iOS App: iCloud”的示例。
- (NSMetadataQuery*)textDocumentQuery {
    NSMetadataQuery* aQuery = [[NSMetadataQuery alloc] init];
    if (aQuery) {
        // Search the Documents subdirectory only.
        [aQuery setSearchScopes:[NSArray
                    arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];

        // Add a predicate for finding the documents.
        NSString* filePattern = [NSString stringWithFormat:@"*.%@",
                    STEDocFilenameExtension];
        [aQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@",
                    NSMetadataItemFSNameKey, filePattern]];
    }

    return aQuery;
}

6
我从未见过在这么简单的情况下代码做到这一点。你能提供一个你看过的真实例子吗? - Chuck
至少在iOS中,如果您的alloc由于内存原因返回nil,则您的应用程序无论如何都会被操作系统杀死。 - Bryan Chen
@Chuck,我添加了一个示例。 - Tenfour04
@xlc 谢谢,知道这点很有帮助。 - Tenfour04
有趣的是,如果这是一个预先ARC的示例,则违反了苹果自己的标准,即在方法名称中没有使用“new”或其他特殊单词返回保留对象。 - Hot Licks
1个回答

5

如果初始化失败,应该返回 nil。例如,如果给initWithFile:传递了不存在的路径,则会出现这种情况。

在 Objective-C 中,你可以向 nil 发送消息(与 C++ 不同,你不能在 NULL 上调用方法),因此在操作该对象之前不需要检查 if (object)。另一方面,如果您想将对象添加到数组中,则应检查它是否为 nil:

SomeClass *anObject = [SomeClass alloc] initializerThatMightReturnNil]
[anArray addObject:anObject]

如果 anObjectnil,那么就会抛出异常。

所以回答你的问题:通常情况下不需要在每次初始化后都检查 nil,只需确保了解对象为空时会发生什么。


谢谢解释。我刚刚添加了一个来自苹果教程的示例。他们使用一个不带参数的初始化器分配和初始化NSMetadataQuery。即使有,我认为你也不想通过测试nil来隐藏错误...当你测试时,你想要抛出异常,这样你就可以轻松地跟踪到错误。但在这种情况下,我不知道为什么引用会在没有参数初始化后立即为空。 - Tenfour04
1
@Tenfour04 - 苹果的示例中有很多奇怪的东西。在特定情况下需要检查 nil,但通常情况下,如果返回 nil,则是因为应用程序环境出现了严重问题,所以让事情“自然”崩溃是完全可以接受的。 - Hot Licks
(只是为了确保上面的评论不被误解,我们在谈论分配/初始化调用,而不是返回对象指针的一般情况下的方法调用。) - Hot Licks
如答案所述,alloc/init 可能会返回 nil 而不会出现严重的问题,例如在 NSArrayNSObject 上使用 initWithContentsOfFile:initWithContentsOfURL:。但我同意,如果文档没有提到 init… 返回 nil 的情况,那么如果确实发生了这种情况,就会有其他严重的问题。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接