Jump to content

Objective C , dudas y respuestas.


Xifu

Recommended Posts

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 by Xifu
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Guest Darkness

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Guest Darkness

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

Some pretty cookies are used in this website