2015-08-15 3 views
5
  1. ci sono tre modi per creare variabile array:la gestione della memoria di sintassi letterale

    • NSArray *array = @[@0, @1];

    • NSArray *array = [NSArray arrayWithObjects:@0, @1, nil];

    • NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil];

  2. Quando uso la seconda modalità per creare, la "matrice" varialbe verrà lanciata in autoreleasepool; Quando uso il terzo, il retainCount di var sarà 1 ma non verrà lanciato per autoreleasepool; Voglio sapere che la prima modalità ha lo stesso effetto Con la seconda modalità o la terza modalità;

+0

Obbligatorio www.whentouseretaincount.com. :) – bbum

risposta

2

La regola generale è che se non richiamare un metodo che inizia con "alloc" o "nuovo" o contenenti "copia", allora non possiedi l'oggetto e non hai né il diritto né la responsabilità di rilasciarlo. Anche se, naturalmente, se si mantiene un oggetto in modo esplicito, è necessario bilanciarlo con una versione (o autorelease, che è semplicemente un altro modo di arrangiarlo per rilasciarlo).

Non tentare di ragionare su quali oggetti possono o non possono essere nel pool di autorelease. Inoltre, non tentare di ragionare sui conteggi di conservazione. Basta preoccuparsi dei diritti di proprietà e delle responsabilità.

+0

E 'anche importante notare che con ARC, molti esempi di autorelease sono ottimizzati, quindi ragionare sull'autoreasepool è ancora più difficile e infruttuoso. –

+0

Mentre questa risposta ha buone informazioni, in realtà non risponde alla domanda. Il numero 1 è come # 2 o # 3? – rmaddy

+0

@rmaddy, penso che risponda bene. # 1 non implica l'invocazione di un metodo che inizia con "alloc" o "nuovo" o contenente "copia". # 2 non implica questo. # 3 fa. Quindi, non posso fidarmi di un lettore che tragga una conclusione da questo? –

3

Il risultato della prima e della seconda modalità è identico. La prima modalità è una sintassi convenienza del secondo

Fonte: Objective-C Literals

+6

Non esattamente vero: i valori letterali si espandono in '+ [NSArray arrayWithObjects: count:]'. Ma riguardo all'autelease il risultato è lo stesso, come hai detto tu. –

1

Considerare sempre il conteggio di mantenimento come delta. Quindi:

1. NSArray *array = @[@0, @1]; 

array ha un conteggio +0 mantenere (che ha mantenuto e poi autoreleased sulla creazione è in gran parte irrilevante e, infatti, potrebbe non sono state mantenute e autoreleased a tutti - ha NSString *foo = @"foo"; la stessa identica +0 semantica, ma i dettagli di implementazione non sono una conservazione/autorelease).

2. NSArray *array = [NSArray arrayWithObjects:@0, @1, nil]; 

Uguale a (1), solo con più esercizi per le dita.

NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil]; 

array ha un +1 conservare conteggio quanto siete preoccupati. L'unico dettaglio che devi sapere è che per le responsabilità del tuo codice per array da rinunciare, quell'oggetto deve essere release doo autorelease d. Indipendentemente dal fatto che sia stato creato con un conteggio di mantenimento +1 ... se ha un conteggio interno di 42 ... se è stato trattenuto 5 volte e autorizzato automaticamente 4 .... tutto è del tutto irrilevante per il tuo codice.

1

parte dettagli di allocazione di memoria, v'è una grande differenza tra

NSArray* array = @[obj1, obj2, obj3]; 

e

NSArray* array = [NSArray arrayWithObjects: obj1, obj2, obj3, nil]; 

La seconda si arresterà al primo argomento nullo. Ci si aspetta un array con tre elementi, ma se obj1! = Nil e obj2 == nil il risultato è un array con un elemento. Il primo lancia un'eccezione se uno qualsiasi di obj1, obj2 o obj3 è nullo.