2015-07-16 18 views

risposta

7

nuovo = alloc + init

Questo metodo è una combinazione di alloc e init. Come allocazione, lo inizializza la variabile di istanza isa del nuovo oggetto in modo che punti nella struttura dei dati della classe. Quindi invoca il metodo init per completare il processo di inizializzazione.

NSObject Class Reference

+new è implementato letteralmente come:

+ (id) new 
{ 
    return [[self alloc] init]; 
} 

e new non supporta inizializzatori personalizzati (come initWithObjects), in modo da alloc + init è più esplicito di quanto new

Così la domanda ora è circa:

[gamma NSArray] vs [[NSArray alloc] init]

La differenza principale tra questi è che se non si utilizza ARC (Automatic Reference Counting). Il primo restituisce un oggetto autoreleased mantenuto e . Il secondo restituisce un oggetto che è solo mantenuto. Quindi, nel primo caso, si vorrebbe mantenerlo se si desidera mantenere lo stesso per un tempo maggiore rispetto al ciclo di esecuzione corrente. Nel secondo caso, , dovresti rilasciarlo o autorizzarlo automaticamente se non hai vuoi tenerlo in giro.

Ora che abbiamo ARC, questo cambia le cose. Fondamentalmente, nel codice ARC, è non importa quale di questi si utilizza.

Ma tenere a mente che [NSArray array] restituisce un array immutabile vuoto, in modo da utilizzare array con NSMutableArray più senso

Per ulteriori informazioni:

alloc, init, and new in Objective-C

Use of alloc init instead of new

Difference between [NSMutableArray array] vs [[NSMutableArray alloc] init]

+0

Aggiungendo fino a questa risposta, relativa a [array NSArray], viene generata una matrice immutabile vuota. È abbastanza inutile farlo ovviamente (come l'utilizzo di nuovo), ma cambia quando si utilizza un NSMutableArray. Il fatto è che, come ha detto @Aladin, ora che abbiamo ARC, non fa alcuna differenza. – Erakk

+0

Arriva all'utilizzo della sintassi Penso e preferisci. – Tander

+0

Non è completamente inutile, puoi fare qualcosa come 'NSArray * arr = [array NSArray]; NSArray * arr2 = [arr arrayByAddingObject: @ "ha!"]; '. Potrebbe essere utile .. ad un certo punto ... credo – Daniel

Problemi correlati