我们需要检查对象是否已实际分配?

时间:2013-09-05 03:29:28

标签: objective-c

在我阅读的大部分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;
}

1 个答案:

答案 0 :(得分:5)

如果初始化失败,初始值设定项应返回nil,例如,如果initWithFile:被赋予不存在的路径,则会发生这种情况。

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

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

如果anObjectnil

,则会抛出异常

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