2013-09-05 5 views
5

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; 
} 
+6

Ich habe noch nie Code in einem so einfachen Fall gesehen. Können Sie ein echtes Beispiel bieten, das Sie gesehen haben? – Chuck

+0

zumindest in ios, wenn Ihre 'alloc' zurück 'nil' aus Speichergrund, Ihre App wird von os sowieso getötet werden. –

+0

@Chuck Ich habe ein Beispiel hinzugefügt. – Tenfour04

Antwort

5

Initializers sollte nil zurück, wenn die Initialisierung fehlschlägt, könnte dies zum Beispiel passieren, wenn initWithFile: einen nicht vorhandenen Pfad angegeben wird.

In Objective-C können Sie Nachrichten an nil senden (anders als z. B. C++, wo Sie keine Methode auf NULL aufrufen können), so dass die Überprüfung if (object) nicht erforderlich ist, bevor Sie für dieses Objekt arbeiten. Auf der anderen Seite, wenn Sie das Objekt zu einem Array hinzufügen möchten, sollten Sie prüfen, ob sie nicht gleich Null ist:

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

Diese eine Ausnahme auslösen würde, wenn anObjectnil

So Ihre Frage zu beantworten ist : Es ist in der Regel nicht notwendig, nach jeder Initialisierung nach nil zu suchen, stellen Sie einfach sicher, dass Sie verstehen, was passiert, wenn das Objekt null ist.

+0

Danke für die Erklärung. Ich habe gerade ein Beispiel aus einem Tutorial von Apple hinzugefügt. Sie reservieren und initialisieren eine NSMetadataQuery mit einem Initialisierer, der keine Argumente annimmt. Und selbst wenn dies der Fall wäre, würde ich meinen, dass du deinen Fehler nicht verstecken willst, indem du nach NULL testest ... du würdest eine Exception geworfen haben, damit du den Bug beim Testen leicht verfolgen kannst. Aber in diesem Fall weiß ich nicht, warum die Referenz gleich null ist, nachdem sie ohne Argumente initialisiert wurde. – Tenfour04

+1

@ Tenfour04 - In Apples Beispielen gibt es viele seltsame Dinge. Es gibt spezielle Fälle, in denen nach nil gesucht wird, aber im allgemeinen Fall, wenn nil zurückgegeben wird, liegt es daran, dass die App-Umgebung ernsthaft aufgebraucht ist und es einfach völlig in Ordnung ist, Dinge "natürlich" abstürzen zu lassen. –

+0

(Nur um sicherzustellen, dass der obige Kommentar nicht aus dem Kontext herausgenommen wird, sprechen wir hier über alloc/init-Aufrufe, nicht den allgemeinen Fall eines Methodenaufrufs, der einen Objektzeiger zurückgibt.) –

Verwandte Themen