objective-c - 我们需要检查对象是否实际分配了吗?

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

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

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

编辑:这是 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;
}

最佳答案

如果初始化失败,初始化程序应返回 nil,例如,如果给 initWithFile: 的路径不存在,则可能会发生这种情况。

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

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

如果 anObjectnil,这将引发异常

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

关于objective-c - 我们需要检查对象是否实际分配了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18627252/

相关文章:

objective-c - 是否可以在不使用 AVAudioSessionCategoryPlayAndRecord 的情况下同时播放和录制音频

objective-c - 如何在 Swift 中覆盖 Objective-c 类函数?

iphone - 如何下载没有文件扩展名的url源代码?

objective-c - 将文件拖放到 NSTableView 上?

iphone - 从字符串中检索图像 url

ios - UIScrollView setContentOffset :animated must be used from main thread only

ios - 具有 204 响应且 Objective-C 中没有内容的 DELETE 请求的巨大延迟

ios - 更新 UITableViewCell subview 的框架没有效果

ios - AudioServicesPlaySystemSound 奇怪的行为

ios - 在UILabel中突出显示特定文本