Tengo un controlador de vista que deseo inicializar con pereza, y una vez inicializado, use la misma copia cuando sea posible (no uso un singleton porque finalmente quiero eliminarlo de la memoria) , utilizo el captador de hacerlo, mi código siguiente aspecto:Inicialización lenta de seguridad de subprocesos en iOS
@property (retain) UIViewController *myController
...
@synthesize myController = _myController;
...
- (UIViewController *)myController
{
if (!_myController) { // Evaluation
_myController = [[MyViewController alloc] init]; // Object Creation
}
return _myController;
}
esto funciona, pero no es seguro para subprocesos, y si más de un hilo como resultado true antes de crear el objeto, voy a tener una pérdida de memoria Una solución que he intentado es sincronizar el código, pero no estoy seguro de la forma correcta de hacerlo.
Esto parece funcionar, (lockForMyController es un NSString sencilla) pero hace que esta sección del código mucho más lento:
- (UIViewController *)myController
{
@synchronized(self.lockForMyController){
if (!_myController) {
_myController = [[MyViewController alloc] init];
}
}
return _myController;
}
Me preguntaba si hay alguna otra forma de lograr un vago inicializado, hilo seguro, propiedad?
Tengo problemas para adaptarlo. Puedo hacer que funcione como un singleton, pero luego tengo problemas cuando uso '[_myController release]; _myController = nil; 'y luego trato de crearlo de nuevo, ya que no puedo restablecer la variable' static dispatch_once_t once'. – Yamanqui
Hmm déjame actualizar mi pregunta con una sugerencia que debería funcionar. – logancautrell
Muchas gracias, la solución actualizada funciona perfectamente. – Yamanqui