2015-10-23 14 views
7

Sembrano esserci diversi metodi di istanziazione di NSArrays (lo stesso per NSDictionary e alcuni altri).Differenza tra NSArray.array/.new/@ []/alloc-init

so:

  1. [NSArray array]
  2. [NSArray new]
  3. @[]
  4. [[NSArray alloc] init]

Per motivi di leggibilità solito bastone con [NSArray array], ma qual è la differenza tra tutti i soggetti, fanno davvero tutti Fai lo stesso?

+0

Confronta http://stackoverflow.com/questions/5423211/difference-between-nsmutablearray-array-vs-nsmutablearray-alloc-init, http://stackoverflow.com/questions/14527489/using-array-of- items-vs-nsarray-arraywithobjects e http://stackoverflow.com/questions/719877/use-of-alloc-init-instead-of-new. –

+0

E qual è esattamente la domanda relativa a [rapido]? –

risposta

11

Il risultato è lo stesso per tutti, si ottiene un nuovo array vuoto immutabile. Tuttavia, i diversi metodi hanno implicazioni di gestione della memoria differenti. Utilizzando ARC questo non fa differenza alla fine, ma prima di ARC dovresti utilizzare la versione corretta o inviare messaggi di ritenzione, rilascio o autorelease appropriati.

[NSArray new] e [[NSArray alloc] init] restituiscono un array con un conteggio di mantenimento +1. Prima di ARC dovresti rilasciare o autorelease su quell'array o perdere memoria.

[NSArray array] e @[] restituiscono una matrice già autorizzata (conserva il conteggio 0). Se si desidera che rimanga senza ARC, è necessario mantenerlo manualmente oppure essere deallocato quando viene aperto il pool di autorelease corrente.

7
  1. [NSArray array]: Crea e restituisce un array vuoto

  2. [NSArray new]: alloc, init e restituire un oggetto NSArray

  3. @[]: Come 1.

  4. [[NSArray alloc] init]: Come 2.

differente tra [NSArray array] e [[NSArray alloc] init] è se ci sono non-ARC:

  • [NSArray array] è un oggetto autorelease. Devi chiamare retain se vuoi tenerlo. E.g quando si dispone di un array return.

  • [[NSArray alloc] init] è un oggetto mantenuto. Quindi non devi chiamare più retain se vuoi tenerlo.

Con ARC, sono uguali.

+0

sarebbe più sensato se poteste anche spiegare quando dovremmo essere consapevoli della differenza tra '[NSArray array];' e '[[NSArray alloc] init];' per esempio e perché. – holex

+0

@holex. Grazie. Ho migliorato la mia risposta. – anhtu