Domanda

Ho imparato a sviluppare applicazioni sulla piattaforma touch cacao. Ho fatto molta strada, ma un pezzo che non riesco ad avvolgere la testa è la gestione della memoria.

Ho pensato di prendere una via di confronto piuttosto che provare a ricominciare da zero. Non riesco a trovare molto sulla differenza tra CLR (.net) e Objective-C 2.0, quindi mi chiedo se la comunità di overflow dello stack possa aiutarmi con questa domanda.

Quali sono le differenze chiave / importanti nella gestione della memoria tra Objective-C 2.0 e CLR? Per quanto riguarda Objective-C 2.0, sto sviluppando sul sistema operativo iPhone e la funzionalità di rilascio automatico è sconsigliata.

Immagino che sto cercando un confronto tra i due ... Dato che provengo da un background .NET, quali potrebbero essere le cose che devo sapere sulla gestione della memoria di Objective-C 2.0?

Grazie a tutti!

È stato utile?

Soluzione

Il CLR viene eseguito in una macchina virtuale; tutta la deallocazione degli oggetti è gestita dal sistema di garbage collection. Generalmente nella memoria Objective-C deve essere gestita manualmente tramite malloc / free in stile C vecchio o tramite il sistema di conteggio dei riferimenti di hold / release. Se provieni da uno standard "C" sullo sfondo, la tecnica non sembrerà troppo estranea.

Con il conteggio dei riferimenti, il sistema conta quante volte viene utilizzato un oggetto specifico - questo è fondamentalmente il "conserva" menzionato sopra. Quando qualcosa viene fatto usando un oggetto, l'oggetto viene inviato manualmente a " release " messaggio che decrementa il conteggio di mantenimento dell'oggetto di 1. Quando il conteggio raggiunge 0, il sistema trasferisce automaticamente l'oggetto. Ciò sembrerà estremamente ingombrante rispetto al CLR / .NET, ma quel meccanismo offre prestazioni migliori e un maggiore controllo.

Se stai codificando in Objective-C 2.0 su Macintosh, sei fortunato dato che la garbage collection può essere abilitata tramite un'opzione in XCode. Questo sarà più vicino a ciò che fornisce il CLR. Se stai sviluppando su iPhone, la raccolta dei rifiuti costa troppo in termini di memoria e CPU, quindi non è un'opzione. La memoria deve essere gestita manualmente.

Fortunatamente, esiste un'opzione intermedia che viene comunemente utilizzata inviando e "autorelease" messaggio a un oggetto. Questo meccanismo, incluso sia in Macintosh che in iPhone, fondamentalmente raggruppa gli oggetti allocati in un dizionario globale (in realtà si chiama pool di rilascio automatico). Quando l'applicazione esiste o quando il pool viene svuotato, gli oggetti vengono quindi allocati. Tuttavia, non tutto viene inserito nel pool di rilascio automatico né si desidera inserire tutto lì. Raccomando la lettura secca ma importante del linguaggio di programmazione Objective-C 2.0 dal sito di Apple che approfondisce in modo più dettagliato.

http://developer.apple.com/documentation /Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

Buona fortuna e abbi pazienza. Objective-C non è un bambino nuovo nel blocco come .Net (ha più di 25 anni) ma ha alcune incredibili funzionalità che .Net sta iniziando a incorporare proprio ora.

Altri suggerimenti

Sull'iPhone è manuale. Se si alloca o si conserva la memoria, è necessario rilasciarlo.

Nel .NET CLR non ti importa di quanto sia la memoria o quale oggetto ne fa per la maggior parte.

Per l'iPhone è necessario bilanciare ogni allocazione di oggetti, inizializzare o conservare con una versione. Poiché l'iPhone utilizza un semplice meccanismo di conteggio dei riferimenti, una volta che il conteggio scende a 0, l'oggetto verrà ripulito.

Una cosa a cui avevo bisogno di abituarmi è che puoi avere una proprietà che mantiene automaticamente una conservazione, quindi se crei un oggetto quindi assegnalo alla proprietà avrà un conteggio di 2. Ciò che funziona meglio è creare il oggetto a una variabile temporanea assegnare alla proprietà, quindi rilasciare la variabile temporanea per ridurre il conteggio a 1.

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