在我阅读的大部分Objective-C示例以及Objective-C文档中,使用对象之前总是会检查是否成功完成。
例如:
这不会影响对错误的追踪吗?我不确定为什么除了内存不足,分配会失败,但从来没有在Java(我正在迁移的语言)中看到过像这样在初始化对象后立即进行检查。
我想,如果您检查每个单独的分配并尝试对失败的分配做出反应,那么应用程序会变得非常复杂。我猜你可以在很多情况下向用户显示错误消息,但程序中的分支数可能会增加一倍。
但在我看到的示例中,当分配失败时,它们除了跳过一些必要的代码以使用户看到他们在屏幕上期望的内容外,不做任何事情。如果在实际使用中,分配失败确实经常发生,并且您遵循这种编码风格,那么结果可能是空白屏幕、用户认为已保存但未保存的文档、用户和程序员都不知道的损坏数据等等。
编辑:这里有一个来自苹果教程“Your Third iOS App: iCloud”的示例。
例如:
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;
}
alloc
由于内存原因返回nil
,则您的应用程序无论如何都会被操作系统杀死。 - Bryan Chen