¿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
static
variables @David declaradas dentro de un método / función son las mismas que unastatic
variable 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+sharedInstance
método (incluso en subprocesos diferentes) "verá" la mismasharedInstance
variable.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 elsharedInstance
acceso. 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 anularinit
para 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
c1
ser una instancia deAAA
la superclase de '? Es necesario llamar+alloc
aself
, no ensuper
.super
no 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.super
todavía señalaself
clase. 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, elself
puntero == objeto de clase actual se pasará al asignador, y finalmenteAAA
se asignará la instancia.super
funciona 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_t
te ayuda a resolver una condición de carrera al permitir que su bloqueo se envíe una sola vez.Static
le 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
alloc
init
(es decir, todavía tenemosalloc
init
mé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