In den meisten der Objective-C-Beispiele, die ich gelesen habe, sowie in der Objective-C-Dokumentation werden Objekte vor der Verwendung immer auf eine erfolgreiche Beendigung überprüft.Müssen wir überprüfen, ob Objekte tatsächlich zugewiesen wurden?
Zum Beispiel:
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
Wird dies nicht machen es schwer, Fehler zu verfolgen? Ich bin mir nicht sicher, warum die Zuweisung anders als geringer Speicher fehlschlagen würde, aber ich habe nie eine Überprüfung wie diese in Java (die Sprache, aus der ich migriere) direkt nach der Initialisierung eines Objekts getan.
Ich nehme an, es würde eine App sehr verschachtelt, wenn Sie jede einzelne Zuweisung überprüft und versucht, auf fehlgeschlagene Zuweisungen zu reagieren. Ich schätze, Sie könnten in vielen Fällen eine Fehlermeldung an den Benutzer anzeigen, aber die Anzahl der Verzweigungen im Programm würde sich wahrscheinlich verdoppeln.
Aber in den Beispielen, die ich gesehen habe, tun sie nichts, wenn Zuteilung fehlschlägt, neben dem Überspringen von Code, der für den Benutzer notwendig sein würde, um zu sehen, was sie auf dem Bildschirm erwarten. Es sieht so aus, als wenn in der Praxis gescheiterte Zuweisungen wirklich passieren würden und Sie diesem Codierungsstil folgen. Das Ergebnis wären leere Bildschirme, nicht gespeicherte Dokumente, von denen der Benutzer denkt, dass sie gespeichert wurden, beschädigte Daten, die der Benutzer und Programmierer nicht kennen. usw.
EDIT: Hier ist ein Beispiel aus Apples Tutorial "Ihre dritte 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;
}
Ich habe noch nie Code in einem so einfachen Fall gesehen. Können Sie ein echtes Beispiel bieten, das Sie gesehen haben? – Chuck
zumindest in ios, wenn Ihre 'alloc' zurück 'nil' aus Speichergrund, Ihre App wird von os sowieso getötet werden. –
@Chuck Ich habe ein Beispiel hinzugefügt. – Tenfour04