AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

2
1

Hola a todos

Para resolver el problema de pasar datos entre clases encontre que me puede funcionar una clase de tipo Singleton no si alguien tiene alun tutorial para poder declarar y usar una clase de tipo Singleton

Saludos.

preguntado 04 May '11, 20:19

pronuer's gravatar image

pronuer
31789

Para eso no se usan singletons... Un singleton se hace para cuando quieres asegurarte de que en tu app solo hay una instancia de una determinada clase, por ejemplo, una clase de usuario que esté logeado en algún web server.

Para pasar datos de una vista a otra, lo suyo es usar delegación entre objetos como patrón de desarrollo...

(05 May '11, 15:18) juanmac ♦

Creo que juanmac tiene razón. Un singleton representa una única instancia de una clase; si quisieras tener un singleton como forma de pasar datos sería para asegurarte que ese dato es único en toda tu aplicación. Para pasar datos entre diferentes objetos existen otros patrones de diseño que, dependiendo de tu problema, podrían funcionar o no.

(05 May '11, 17:14) sawbona

Pues si te va más o menos el inglés, en la referencia de Apple Cocoa Fundamentals Guide hay un apartado (Creating a Singleton Instance) que explica qué son los Singletons y cómo implementar uno.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

Espero te sea de utilidad.

enlace permanente

respondido 04 May '11, 22:19

sawbona's gravatar image

sawbona
161129

Buenas pronuer,

Pues con simplemente poner esto en tu clase:

static Clase *instance = nil;

+ (id)sharedInstance
{
    if (!instance)
    {
        instance = [Clase new];
    }
    return instance;
}

Ya vale.

Luego accederías con algo como:

[[Clase sharedInstance] método];

De igual modo, puedes acceder a las propiedades del objeto.

¡Un saludete!

enlace permanente

respondido 05 May '11, 15:08

juanmac's gravatar image

juanmac ♦
3.0k334181

Esto no es suficiente. Un singleton es un objeto que se queda siempre en memoria y no se puede liberar. La implementación completa esta en el documento sugerido en la primera respuesta.

(05 May '11, 19:22) geppy

Lo sé. Pero como lo he visto un poco perdido, le he sugerido la vía rápida... :P

(05 May '11, 19:24) juanmac ♦

Como ya te han comentado un Singleton es un patron de diseño que te aseguro que sólo existirá una instancia de esa clase en toda la aplicación. El uso masivo de singleton indica una mala construcción ya que realmente un singleton es algo peligroso (del mismo modo que las variables globales o estáticas lo pueden ser), pero esto no significa que a veces sea necesario su uso.

En los frameworks de Objective-c de la propia Apple existen muchos singletons, como por ejemplo el acceso a la aplicación con [UIApplication sharedApplication] donde lógicamente sólo puede existir una sola instancia de nuestra aplicación, o [NSUserDefaults standardDefaults] para que también exista una instancia común para almacenar los datos.

Las construcciones del singleton son tal y como te han comentado anteriormente pero hay que tener cuidado por que El singleton debe de ser thread safety y esas construcciones anteriores no lo son. Y es posible que se llamen desde distintos threads y cada uno cree una instancia distinta y evidentemente no es lo que queremos.

Para la construcción de un singleton thread safety hemos de bien utilizar el GCD para asegurarnos siempre de estar en el main thread

+(MyClass *)singleton { 
    static dispatch_once_t pred;
    static MyClass *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[MyClass alloc] init];
    });
    return shared;
}

mas informacion en CocoaSamurai

O bien sincronizando con el main thread

static SomeClass* shared_instance;
+(SomeClass*) sharedInstance {
    @synchronized( shared_instance ) {
        if( !shared_instance ) {
            shared_instance = [[SomeClass alloc] init];
            //some additional initialization here
        }
    }

    return shared_instance;
}

Un poco de rollo pero mucha gente no cae en lo de thread safety y después pueden tener problemas muy difíciles de debuggear

enlace permanente

respondido 06 May '11, 13:21

hector%20spc's gravatar image

hector spc
1264510

Según tengo entendido hacer a un singleton thread safe, depende si este será utilizado concurrentemente por varios threads; si no es el caso no es necesario "sobre cargar" al singleton con esta funcionalidad ya que hacer un método synchronized es una operación costosa. De igual forma si el singleton es inmutable no es necesario hacerlo synchronized.

Al menos es lo que he leido... :P

(06 May '11, 19:49) sawbona

Hola, creo que las respuestas de arriba te han aclarado las dudas. Pero te dejo aquí un enlace a un artículo es castellano que justamente describe el uso de singletons: "Cómo crear un Singleton en Objective C y Cocoa"

Un saludo, Gabriel

enlace permanente

respondido 08 May '11, 22:30

Gabriel's gravatar image

Gabriel
146137

Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×205
×54
×1

Pregunta realizada el: 04 May '11, 20:19

Pregunta visitada: 2,133 veces

Última modificación: 08 May '11, 22:30

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación