2009-06-13 17 views
72

È 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?

risposta

110

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 variabile isa 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.

+3

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 ... :-) –

+0

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

+0

La mia esperienza anche in modalità di rilascio per iOS è che anche le variabili locali sono inizializzate su 0 – jjxtra

-1

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.

+0

Suppongo che possiamo vedere questo come una risposta valida per C++, mentre la risposta di Adam si applica a Objective-C? – Felixyz

+11

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. –

-2

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.

+1

@ La risposta di AdamRosenfield contraddice direttamente la tua affermazione secondo cui anche le vars locali sono inizializzate a zero. Chi ha torto? –

Problemi correlati