Nella maggior parte degli esempi di Objective-C che ho letto, nonché nella documentazione di Objective-C, gli oggetti vengono sempre controllati per il completamento con esito positivo prima dell'uso.È necessario verificare che gli oggetti siano effettivamente allocati?
Ad esempio:
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
non sarà questa rendere difficile rintracciare bug? Non sono sicuro del motivo per cui l'allocazione fallirebbe a parte la memoria insufficiente, ma non ho mai visto un controllo come questo fatto in Java (il linguaggio da cui sto migrando) subito dopo l'inizializzazione di un oggetto.
Suppongo che renderebbe un'app molto complicata se si controllasse ogni singola allocazione e si provasse a reagire alle allocazioni fallite. Immagino che potresti mostrare un messaggio di errore all'utente in molti casi, ma il numero di rami nel programma probabilmente raddoppierà.
Ma negli esempi che ho visto, non fanno nulla quando l'allocazione fallisce, oltre a saltare qualche codice che sarebbe necessario per l'utente per vedere cosa si aspettano sullo schermo. Sembra che se le allocazioni fallite avvengono davvero molto in pratica, e stai seguendo questo stile di codifica, il risultato sarebbero schermi vuoti, documenti non salvati che l'utente pensa siano stati salvati, dati corrotti che l'utente e il programmatore non sono a conoscenza, ecc.
MODIFICA: Ecco un esempio del tutorial di Apple "La tua terza app 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;
}
Non ho mai visto il codice farlo in un caso così semplice. Puoi offrire un esempio reale che hai visto? – Chuck
almeno in ios, se il tuo 'alloc' restituisce' nil' per motivi di memoria, la tua app verrà comunque uccisa da os. –
@Chuck Ho aggiunto un esempio. – Tenfour04