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];
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à;
risposta
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à.
E 'anche importante notare che con ARC, molti esempi di autorelease sono ottimizzati, quindi ragionare sull'autoreasepool è ancora più difficile e infruttuoso. –
Mentre questa risposta ha buone informazioni, in realtà non risponde alla domanda. Il numero 1 è come # 2 o # 3? – rmaddy
@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? –
Il risultato della prima e della seconda modalità è identico. La prima modalità è una sintassi convenienza del secondo
Fonte: Objective-C Literals
Non esattamente vero: i valori letterali si espandono in '+ [NSArray arrayWithObjects: count:]'. Ma riguardo all'autelease il risultato è lo stesso, come hai detto tu. –
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.
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.
Obbligatorio www.whentouseretaincount.com. :) – bbum