El Cicle de Vida d'un Objecte CocoaUn objecte cocoa existeix durant la seva vida, almenys potencialment, té fases diferents. És crea, s'inicialitza, s'usa (es a dir, altres objecte li envien missatges). Possiblement es reté, es copia o s'arxiva i eventualment s'allibera i es destrueix. El següent articles passa per la vida d'un objecte típic sense entrar massa en el detall.
Començarem pel final, en la forma que els objectes es col·loquen. A diferència d'altres llenguatges de programació, l'Objective-C no té "recollidor de brossa" que facilitat que s'alliberin els objectes automàticament quan no es necessiten més. Per superar el consum del recollidor de brossa i la seva poca flexibilitat, Cocoa i l'Objective-C han optat per un procediment voluntari amb una política de realització per mantenir els objectes i disposar-ne fins que ja no siguin necessaris. Aquest procediment i política es basen en el comptatge de referències. Cada objecte Cocoa duu un enter indicant el nombre d'altres objectes que els interessa la seva persistència. Aquest enter es refereix al comptador retain de l'objecte. Quan crees un objecte utilitzant les mètodes de classe
Després de l'assignació de l'objecte, normalment l'inicialitzaràs definits les seves variables d'instància a uns valors inicials raonables. (L'NSObject declara el mètode
Quan alliberes un objecte -- que és, enviar-li un missatge
Què fas si no vols utilitzar més un objecte? Si després de crear un objecte li envies un missatge Figura 1: El cicle de vida d'un objecte -- vista simplificada Per descomptat, en aquest escenari el creador d'un objecte no té necessitat de retenir l'objecte. Aquest ja és el propietari de l'objecte. Però si aquest creador passa l'objecte a un altre objecte en un missatge, la situació canvia. En un programa en Objective-C, un objecte rebut d'algun altre objecte sempre s'assumeix dins de l'abast on s'ha obtingut. L'objecte rebut pot enviar missatges a un objecte receptor i pot passar-lo a altres objectes. Aquesta assumpció requereix que l'objecte que envia "es comporta" i no allibera prematurament l'objecte mentre un objecte client el referencia. Si l'objecte client vol mantenir l'objecte rebut després que aquest surti de l'abast del programa, pot retenir-lo -- és a dir, enviar-li un missatge Figura 2: Retenint un objecte rebut En comptes de retenir un objecte tu pots copiar-lo enviant-li un missatge En termes d'ús, el que diferencia un Figura 3: Copiant un objecte receptor Potser has vist un problema potencial amb aquest esquema de gestionar el cicle de vida de l'objecte. Un objecte que crea un objecte i el passa a un altre objecte no pot saber quan pot alliberar-se sense problemes. Hi podrien haver múltiples referències a aquest objecte en la pila de crides, alguns per objectes desconeguts per l'objecte creador. Si l'objecte creador allibera l'objecte creat i llavors algun altres objecte envia un missatges a aquest objecte ara destruït, el programa podria caure. Per abordar aquest problema, Cocoa introdueix un mecanisme per deferir la des-assignació anomenada autoreleasing. L'Autoreleasing fa ús dels pous d'autoalliberament (definits per la classe NSAutoreleasePool). Un pou d'autoalliberament és una col·lecció d'objectes dins un un abast definit explícitament que estan marcats per alliberaments eventuals. Els pous d'autoalliberament poden jerarquitzar-se. Quan envies a un objecte un missatge Figura 4: Un pou d'autoalliberament La discussió del cicle de vida d'objecte s'ha centrat fins ara en els mecanismes per gestionar els objectes a través d'aquest cicle. Però una política del propietari de l'objecte utilitza aquests mecanismes. Aquesta política pot resumir-se en el següent:
Contràriament,
Com en qualsevol conjunt de regles, hi ha excepcions:
Si no segueixes aquesta política de propietaris, et poden passar dues coses dolentes en el teu codi Cocoa. Doncs ni alliberar objectes creats, copiats o retinguts, perdràs memòria. O el teu programa tindrà errors dons enviarà un missatge a un objecte que dessassignat per tu. Hi ha una altra advertència: Eliminar aquests error pot portar molt de temps. Un altre esdeveniment bàsic podria succeir durant el cicle de vida, és l'arxivat. L'arxivat converteix la xarxa d'objectes inter-relacionats que componen el programa orientat a objecte -- el graf d'objecte -- en una forma persistent (normalment un fitxer) que preserva la identitat i relacions de cada objecte en el graf. Quan un programa és des-arxivat, el seu graf d'objecte es reconstrueix des de l'arxiu. Per participar en l'arxivat i (des-arxivat), un objecte ha de ser capaç de codificar (i descodificar) les variables d'instància utilitzant els mètodes de la classe NSCoder. L'NSObject adopta el protocol NSCoding per aquest propòsit. Aquesta descripció del cicle de vida dels objectes Cocoa grata la superfície del que s'ha de dir del tema. Mireu Gestió de la Memòria per informació més detallada. per Carles el 05/09/2005 - 11:03, actualitzat el 05/09/2005 - 11:06 | versió per a imprimir | entreu o registreu-vos per a enviar comentaris
|
apadrinamentsAjuda a fer crèixer la barra verda amb les teves donacions!
61% (190,0 de 314,0€) 47% (545,0 de 1.170,0€) 33% (528,0 de 1.610,0€) 63% (38.010,0 de 60.000,0€) 61% (700,0 de 1.155,0€) comesfa.orgel teu usuariopcionsQui està en líniaAra hi han 0 usuaris i 375 convidats connectats.
és populard'avui... |