Domanda

In arrivo verso la fine dello sviluppo di un'applicazione per iPhone e mi chiedo quanto sia male usare il rilascio automatico durante lo sviluppo per l'iPhone. Sono di fronte ad alcuni crash abbastanza casuali e, finora, non riesco a identificarlo con qualcosa di diverso dall'uso di memoria sciatta.

Come principiante di Cocoa, ricordo inizialmente di aver letto un documento guida che suggeriva fortemente di evitare il rilascio automatico a favore del mantenimento / rilascio manuale per iPhone. Tuttavia, uno sviluppatore di cacao più "anziano" si è unito presto (che ironicamente è stato lasciato andare da allora), che ha utilizzato il rilascio automatico in tutto il luogo. Devo ammettere che ero entrato in "scimmia vedi scimmia da fare" modalità, e sembra tornare a perseguitarmi (ora sono l'unico sviluppatore del progetto).

Quindi cosa fare dopo? Mi sembra che devo ramificare il codice e provare a passare e sostituire, ove possibile, il codice di rilascio automatico tenendo le dita incrociate che non rompo inavvertitamente l'app. Sembra che molte chiamate in libreria generino oggetti rilasciati automaticamente come stringWithFormat e praticamente qualsiasi cosa in cui non sto usando alloc me stesso. Eventuali altri gotchya e / o suggerimenti che dovrei cercare? Grazie guru del cacao.

È stato utile?

Soluzione

L'uso di release invece di autorelease può migliorare l'utilizzo della memoria in spazi ristretti (il che è positivo su iPhone), ma non sarà affatto d'aiuto in caso di crash se non stai seguendo le regole di conservazione / rilascio. Leggerei alcuni tutorial sulla gestione della memoria in Obj-C se sei ancora un po 'confuso su ciò che dovresti fare, e poi andrei dopo quegli arresti anomali utilizzando il debugger e i rapporti sugli arresti anomali per scoprire dove stai rilasciando oggetti . Questo e questo sono due buoni punti di partenza.

Altri suggerimenti

Più importante della scelta di rilascio automatico o di rilascio manuale è la frequenza con cui allocare e dealloc i tuoi NSAutoreleasePool . Dato che la maggior parte dei framework Cocoa utilizza autorelease in maniera libera, è necessario disporre di una strategia di drenaggio della piscina adeguata. Una volta che questo è a posto, la scelta se rilasciare o rilascio automatico diventa molto meno un problema.

Detto questo, le uniche aree di cui dovresti preoccuparti sono loop stretti: alloca e rilascia un NSAutoreleasePool ogni poche iterazioni per i migliori risultati; e quando hai generato un altro NSThread che non ha un Runloop - crea un pool e svuotalo ogni tanto diventa inattivo. Poiché la maggior parte delle applicazioni alloca solo una piccola quantità di dati per evento, la strategia di UIKit di allocare il pool prima della spedizione dell'evento e rilasciarlo dopo che i resi di spedizione funzionano molto bene.

Se pensi di non sapere come utilizzare il rilascio automatico, dai un'occhiata a CS193p FALL 2010 su iTunes U - > Conferenza numero 4.

Ti insegna tutto sulla gestione della memoria e altro (se salti i primi 10 minuti circa)

Per motivi di prestazioni dell'iPhone, Apple suggerisce che, quando possibile, non dovresti usare oggetti con licenza automatica. Invece, rilascia esplicitamente i tuoi oggetti quando hai finito con loro.

L'uso di pool di autorelease significa che potresti lasciare un po 'di memoria inutilizzata in giro. Poiché l'iPhone ha meno memoria per spostarsi, è possibile migliorare le prestazioni se si libera la memoria non necessaria il più presto possibile, invece di lasciarla stare occupando risorse mentre attende un rilascio automatico.

Quando esegui il rilascio automatico, in pratica stai dicendo: " Non ne ho più bisogno, ma chiunque altro è libero di ritirarlo (prima che il pool di rilascio automatico venga svuotato) " ;. Quando rilasci esplicitamente un oggetto, stai dicendo: " Non ne ho più bisogno e, a meno che qualcun altro non abbia già detto diversamente (acquisito), dovrebbe essere deallocato immediatamente. & Quot;

Di conseguenza, il rilascio automatico non è normalmente la cosa sbagliata. È necessario quando si desidera restituire gli oggetti al mittente di un messaggio senza richiedere al mittente di occuparsi del rilascio dell'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top