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(我从中迁移的语言)中进行这样的检查。

我想如果你检查每一个分配并试图对失败的分配做出反应,它会使应用程序非常复杂。我猜你可以在很多情况下向用户显示错误消息,但程序中的分支数量可能会翻倍。

但是在我看到的示例中,当分配失败时,它们什么也不做,除了跳过一些用户在屏幕上看到他们期望的内容所必需的代码。看起来如果分配失败在实践中真的发生了很多,并且您遵循这种编码风格,结果将是空白屏幕,用户认为已保存的未保存文档,用户和程序员不知道的损坏数据,等等

编辑:这是 Apple 教程“您的第三个 iOS 应用程序: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;
}
4

1 回答 1

5

如果初始化失败,初始化程序应该返回nil,例如,如果initWithFile:给定一个不存在的路径,这可能会发生。

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

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

anObject如果是,这将引发异常nil

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

于 2013-09-05T03:47:15.743 回答