Xifu Posted March 31, 2013 Report Share Posted March 31, 2013 (edited) Muy buenas chicos, yo actualmente estoy empezando con este estupendo lenguaje, un poco lioso al principio pero con un potencial brutal, y me surgen cantidad de dudas, que voy resolviendo, pero otras no lo tengo muy claro, así que abro este hilo para exponer estas dudas por si alguien puede hecharme una manita. Una duda que tengo actualmente es con la gestión de la memoria, en algunos tutoriales o libros para borrar un objeto de la memoria una vez que se ha utilizado hacen lo siguiente: #import <stdio.h> #import "Fraction.h" int main( int argc, const char *argv[] ) { // create a new instance Fraction *frac = [[Fraction alloc] init]; // set the values [frac setNumerator: 1]; [frac setDenominator: 3]; // print it printf( "The fraction is: " ); [frac print]; printf( "\n" ); // free memory [frac release]; return 0; } Es decir para borrar el objeto frac de la memoria, utilizan [frac release] Yo ahora en este ejemplo de abajo intento utilizar el [b release] y el compilador me da un error ( 'release' is unavailable: not available in automatic reference counting mode) , haciendo referencia a algo llamado ARC (ni idea de lo que significa esto). int main (int argc, char * argv[]) { @autoreleasepool { ClassB *b = [[ClassB alloc] init]; [b initVar]; // will use inherited method [b printVar]; // reveal value of x; [b release]; } return 0; } Seguramente sea por el cambio de versiones y la manera de gestionar estas cosas, Yo actualmente tengo la ultima versión a día de hoy del Xcode. Gracias un saludo. Edited March 31, 2013 by Xifu Quote Link to comment Share on other sites More sharing options...
Disablez Posted March 31, 2013 Report Share Posted March 31, 2013 Te lo cuento por encima... En los viejos tiempos del C (bueno y en los modernos tb), había que gestionar la memoria dinámica a mano; si creas un objeto en memoria dinámica (malloc / alloc) tienes que liberar esa memoria, o acabarás teniendo un memory leak importante al cabo de un rato. Como esto causa más problemas de los que genera, en los lenguajes orientados a objetos de la época se empezó a introducir el garbage collector... un sistema que tiene en cuenta cuantas referencias tiene una zona de memoria dinámica. Si todas las variables que apuntaban a esa zona ya han dejado de usarse, no hay santa manera de acceder a esa zona de memoria, así que está libre y se puede liberar automáticamente. ARC es básicamente lo mismo; en vez de gestionar manualmente (con retain / release), lo gestiona automáticamente (ARC=automatic reference counting) y tienes una cosa menos de la que preocuparte. Hay sus detractores, a los que no les va lo de tener un proceso extra limpiando memoria... pero pienso que es mejor así. Los free a memoria estática, los char* y los punteros nulos han hecho mucho daño :) Si quieres que vaya el ejemplo, desactiva el ARC y listo. Quote Link to comment Share on other sites More sharing options...
Xifu Posted March 31, 2013 Author Report Share Posted March 31, 2013 Gracias dis, entonces entiendo que ya no hace falta utilizar estos parametros para liberar memoria, de hecho creo que la segunda linea del (int) main hace referencia a esto: @autoreleasepool { un saludo. Quote Link to comment Share on other sites More sharing options...
Guest Darkness Posted March 31, 2013 Report Share Posted March 31, 2013 Añado al comentario de Disablez: @autoreleasepool es una directiva para autoeliminar todo lo que se encuentra dentro de dicha directiva. Muy importante!!! Ojo con ejemplos de antes de que naciera ARC, porque puedes aprender cosas que YA NO SON VÁLIDAS, excepto si desactivas ARC como bien dice Disablez. Dicho de otro modo: antes de ARC, la gestión de los objetos y su duración hasta borrado era manual, con ARC es automática. Esto conlleva que no tengas que preocuparte. En general es más cómodo aunque los que somos de la vieja escuela nos sentimos raros con esto del ARC, pero bueno, sin duda es un avance está claro y soluciona muchos problemas. A mí me habría venido fantástico para el AWACS en su versión 1.0. Quote Link to comment Share on other sites More sharing options...
Xifu Posted March 31, 2013 Author Report Share Posted March 31, 2013 Estupendo, aclarado entonces. Un saludo Quote Link to comment Share on other sites More sharing options...
Xifu Posted April 8, 2013 Author Report Share Posted April 8, 2013 Bueno ahi va otra duda sobre los protocolos y delegaciones. Sinceramente no me entero del concepto de estas cosas. Si tengo este codigo por ejemplo: @protocol Drawing -(void) paint; -(void) erase; @optional -(void) outline; @end Define unos metodos, y tal, ¿ pero porque no haces una clase o subclases que sea Drawing, y asi poder utilizar todos sus metodos?. No se, espero que darkness me ilumine con algun ejemplo suyos para aclarar este tema. Gracias un saludo. Quote Link to comment Share on other sites More sharing options...
Guest Darkness Posted April 10, 2013 Report Share Posted April 10, 2013 Esto si te parece lo comentamos esta noche. Básicamente lo que ocurre es que a veces no nos va a interesar crear una subclase y ampliar con nuevos métodos esa subclase. En su lugar lo que hacemos es crear un delegate, que es una ampliación de métodos a una clase determinada. Por ejemplo tienes una clase myclase con los métodos a, b y c. Resulta que un equipo de trabajo está desarrollando sobre esos métodos, pero a ti te asignan que la misma clase tenga los métodos d, e y f. ¿Cómo trabajar ambos con la misma clase? Con delegates. Con un delegate estás ampliando los métodos de la clase myclase sin tener que tocar la misma clase en sí. Es decir los delegates son útiles cuando no quieres crear subclases, sea esa clase propia del sistema o tuya, y le quieres añadir métodos propios. Esto es útil en equipos de trabajo sobre todo. El problema con los delegates es que solo puedes crear métodos, no nuevos atributos. Los protocolos son conjuntos de clases que obligatoriamente/opcionalmente se deberán implementar en una clase cuando se adapta dicho protocolo. Por ejemplo si yo tengo una clase myclase y adapto el protocolo Drawing, deberé obligatoriamente incluir métodos paint y erase, y opcionalmente outline. El motivo de hacer esto es conseguir que cuando una persona use mi clase, sepa que, debido a que la clase ha adaptado el protocolo Drawing, tendrá la seguridad de que hay unos métodos llamados paint y erase, y opcionalmente uno llamado outline. Básicamente es esto, pero ojo, yo personalmente no lo uso mucho, sin embargo otros programadores pueden usarlo profusamente, según cómo quieras trabajar. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.