È sicuro contare su int
s inizializzato sempre a 0 in Objective-C?Gli interi sono sempre inizializzati a 0?
In particolare, quando un oggetto con gli ivars int
è stato appena istanziato, è lecito ritenere che i suoi ivar abbiano valore 0?
È sicuro contare su int
s inizializzato sempre a 0 in Objective-C?Gli interi sono sempre inizializzati a 0?
In particolare, quando un oggetto con gli ivars int
è stato appena istanziato, è lecito ritenere che i suoi ivar abbiano valore 0?
Sì, le variabili di istanza di classe sono sempre inizializzate su 0 (o nil
, NULL
o false
, a seconda del tipo di dati esatto). Vedere la Objective-C 2.0 Programming Language:
Procedimento
alloc
alloca dinamicamente la memoria per le variabili di istanza del nuovo oggetto e li inizializza a 0-tutto, cioè, tranne la variabileisa
che collega la nuova istanza alla sua classe.
EDIT 2013-05-08
Apple sembra aver rimosso il documento di cui sopra (ora legata alla Wayback Machine). L'(attualmente) documento attivo Programming With Objective-C contiene una citazione simile:
Procedimento
alloc
ha un altro importante compito, che è per cancellare la memoria allocata per proprietà dell'oggetto da loro azzeramento. Questo evita il solito problema di memoria che contiene spazzatura da qualunque cosa sia stata memorizzata in precedenza, ma non è sufficiente per inizializzare completamente un oggetto.
Tuttavia, questo è solo vero per le variabili istanza di una classe; è anche vero per i tipi di POD dichiarati in ambito globale:
// At global scope
int a_global_var; // guaranteed to be 0
NSString *a_global_string; // guaranteed to be nil
Con una sola eccezione, è non vero per le variabili locali, o per i dati allocati con malloc()
o realloc()
; è vero per calloc()
, poiché calloc()
esclude esplicitamente la memoria allocata.
L'unica eccezione è che quando il conteggio di riferimento automatico (ARC) è abilitato, i puntatori dello stack agli oggetti Objective-C vengono inizializzati implicitamente su nil
; tuttavia, è comunque buona norma inizializzarli esplicitamente su nil
. Dalle Transitioning to to ARC Release Notes:
variabili di stack vengono inizializzati con
nil
Utilizzando ARC, forte, debole, e autoreleasing variabili di stack sono ora implicitamente inizializzati con
nil
in C++ gli oggetti (e C++ che sono utilizzato in Objective-C++), le variabili di istanza di classe sono anche non inizializzate a zero. È necessario inizializzarli esplicitamente nel/i costruttore/i.
Non penso che dovresti assumere alcun valore per l'inizializzazione. Se stai costruendo la logica attorno a un valore "0", dovresti impostarlo per essere sicuro.
Suppongo che possiamo vedere questo come una risposta valida per C++, mentre la risposta di Adam si applica a Objective-C? – Felixyz
La risposta di Adam per l'Objective C ha esattamente ragione: l'Objective C garantisce assolutamente che ivars sia impostato su nil/NULL/false/0 sull'allocazione ed è perfettamente sensato accettare e utilizzare questo fatto. Ad esempio, ciò consente l'inizializzazione pigra banale di NSMultableArray * ivars con [NSMultableArray array o new] quando vengono notati come nulli. Combinato con il conteggio dell'obiettivo C [[NSMultableArray *) count] restituisce 0, è spesso possibile posticipare ulteriormente l'inizializzazione. Impara ad amare il modo in cui l'obiettivo C lo fa, non solo a combattere le sue differenze. –
Sì, in C le vars globali sono inizializzate a zero. In Objective-C anche i vars locali vengono inizializzati a zero. Puoi contare su di esso.
@ La risposta di AdamRosenfield contraddice direttamente la tua affermazione secondo cui anche le vars locali sono inizializzate a zero. Chi ha torto? –
Spot on. Tuttavia, il fatto che le persone spesso si interrogano su questo dettaglio può essere una ragione sufficiente per essere più espliciti sull'inizializzazione delle variabili, probabilmente la scelta "più sicura". Inizializzare a 0/nil/NULL non fa mai male a nessuno ... :-) –
Sono d'accordo con Quinn. In questo caso, tuttavia, sto creando una classe "astratta" che non implementa - (void) init, e non voglio forzare ogni sottoclasse a ricordare di inizializzare gli ivars. Quindi è bene sapere che posso contare sul fatto che siano inizializzati a 0. – Felixyz
La mia esperienza anche in modalità di rilascio per iOS è che anche le variabili locali sono inizializzate su 0 – jjxtra