¿Cómo convierto (o creo) una clase singleton que compila y se comporta correctamente cuando uso el conteo automático de referencias (ARC) en Xcode 4.2?
objective-c
ios
singleton
automatic-ref-counting
cescofry
fuente
fuente

Respuestas:
Exactamente de la misma manera que (debería) haberlo hecho ya:
fuente
staticvariables @David declaradas dentro de un método / función son las mismas que unastaticvariable declarada fuera de un método / función, solo son válidas dentro del alcance de ese método / función. Cada ejecución por separado del+sharedInstancemétodo (incluso en subprocesos diferentes) "verá" la mismasharedInstancevariable.si desea crear otra instancia según sea necesario. haga esto:
de lo contrario, deberías hacer esto:
fuente
dispatch_once()bit significa que no obtendrá instancias adicionales, incluso en el primer ejemplo ...?[[MyClass alloc] init]y omitir elsharedInstanceacceso. DongXu, deberías mirar el artículo Singleton de Peter Hosey . Si va a anularallocWithZone:para evitar que se creen más instancias, también debe anularinitpara evitar que la instancia compartida se reinicialice.allocWithZone:versión. Gracias.Esta es una versión para ARC y no ARC
Cómo utilizar:
MySingletonClass.h
MySingletonClass.m
fuente
Este es mi patrón bajo ARC. Satisface el nuevo patrón con GCD y también satisface el antiguo patrón de prevención de creación de instancias de Apple.
fuente
c1ser una instancia deAAAla superclase de '? Es necesario llamar+allocaself, no ensuper.superno significa el objeto de superclase . No puede obtener un objeto de superclase Simplemente significa enrutar mensajes a la versión de superclase del método.supertodavía señalaselfclase. Si desea obtener un objeto de superclase, necesita obtener funciones de reflexión en tiempo de ejecución.-allocWithZone:método es solo una cadena simple a la función de asignación de tiempo de ejecución para ofrecer un punto de anulación. Entonces, en última instancia, elselfpuntero == objeto de clase actual se pasará al asignador, y finalmenteAAAse asignará la instancia.superfunciona en los métodos de clase.Lea esta respuesta y luego vaya y lea la otra respuesta.
Primero debe saber qué significa un Singleton y cuáles son sus requisitos, si no lo comprende, entonces no entenderá la solución, ¡en absoluto!
Para crear un Singleton con éxito, debe poder hacer lo siguiente 3:
dispatch_once_tte ayuda a resolver una condición de carrera al permitir que su bloqueo se envíe una sola vez.Staticle ayuda a "recordar" su valor en cualquier cantidad de invocaciones. ¿Cómo se recuerda? No permite que se vuelva a crear ninguna instancia nueva con ese nombre exacto de su SharedInstance, solo funciona con la que se creó originalmente.No usar llamadas
allocinit(es decir, todavía tenemosallocinitmétodos ya que somos una subclase de NSObject, aunque NO deberíamos usarlos) en nuestra clase sharedInstance, lo logramos usando+(instancetype)sharedInstance, que está limitado a iniciarse solo una vez , independientemente de múltiples intentos de diferentes hilos al mismo tiempo y recuerda su valor.Algunos de los Singletons del sistema más comunes que vienen con Cocoa son:
[UIApplication sharedApplication][NSUserDefaults standardUserDefaults][NSFileManager defaultManager][NSBundle mainBundle][NSOperations mainQueue][NSNotificationCenter defaultCenter]Básicamente, cualquier cosa que deba tener un efecto centralizado deberá seguir algún tipo de patrón de diseño Singleton.
fuente
Alternativamente, Objective-C proporciona el método de inicialización + (vacío) para NSObject y todas sus subclases. Siempre se llama antes que cualquier método de la clase.
Establecí un punto de interrupción en uno una vez en iOS 6 y dispatch_once apareció en los marcos de la pila.
fuente
Singleton Class: nadie puede crear más de un objeto de clase en ningún caso ni de ninguna manera.
fuente
Hay dos problemas con la respuesta aceptada, que pueden o no ser relevantes para su propósito.
El siguiente código se ocupa de estos dos problemas:
fuente
Espero que el código anterior lo ayude.
fuente
si necesitas crear singleton en swift,
o
puedes usar de esta manera
fuente