Tuttavia, al momento del ritorno, nessuno del codice controlla se l'oggetto è in grado di esistere. Ma dovrebbe essere controllato, e come può essere gestito?
In genere, la gestione degli errori viene ignorata dalle sottoclassi quando viene restituito nil
. La gestione degli errori viene generalmente lasciata al chiamante quando viene restituito nil
. Come dimostrato nella idiomatica -init
:
- (id)init {
self = [super init];
if (self) {
// initialize
}
return self;
}
Così, se la base rialloca self
in init
, quindi self
viene riassegnato (self = [super init];
). funziona alla grande.
Se non si riesce ad assegnare self
al risultato di inizializzazione super
s' o se non si riesce a verificare la presenza di nil
, allora si può essere aggrappandosi ad una penzoloni/puntatore deallocato (EXC_BAD_ACCESS
), e non si può inizializzare le ivars correttamente (assegneresti effettivamente a un'altra area se non si incontra uno EXC_BAD_ACCESS
).
I due casi in modo più dettagliato:
non riescono ad assegnare sé
- (id)init {
[super init];
if (self) {
// self was not reassigned. if super returned an object other
// than self, then our ivar would be freed, reused, or sitting
// in an autorelease pool, and the returned instance's ivar
// would not be assigned -- we wouldn't know the address.
ivar = 1;
}
return self;
}
non riescono a controllare per nil
- (id)init {
self = [super init];
// super returned nil. ivar is an invalid region:
ivar = 1;
return self;
}
e sì, ho visto entrambi queste.
Se l'oggetto non può esistere, significa che il sistema è seriamente la memoria, e persino spuntando un messaggio di errore sarà anche impossibile?
Niente affatto. Molti inizializzatori restituiscono nil
per dire "impossibile fare in questo contesto", o se c'è un semplice errore di parametro.
Questa è davvero una buona domanda. So di non controllare mai se ottengo qualcosa dal risultato di questo tipo di funzione, presumo solo che alloc/init abbia funzionato (a meno che non si lavori con qualcosa che richiede & errore, che rappresenta qualcosa che ha una possibilità di fallire). Una domanda davvero interessante. – RonLugge
possibile duplicato di [In Objective-C perché dovrei controllare se self = \ [super init \] non è nulla?] (Http://stackoverflow.com/questions/1287950/in-objective-c-why-should- i-check-if-self-super-init-is-not-nil) – omz