在我阅读过的大多数 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]
如果 anObject
为 nil
,这将引发异常
所以回答你的问题:通常没有必要在每次初始化后检查 nil
,只要确保你了解如果对象为 nil 会发生什么。
关于objective-c - 我们需要检查对象是否实际分配了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18627252/