ciclo NSTimer o resolver una referencia a los problemas causados temporizador CADisplayLink.

Como todos sabemos, cuando usamos NSTimer o CADisplayLink, a menudo conducen a hacer referencia a su clase no puede liberar correctamente, es debido a sus referencias a la clase tenía una referencia circular entre ellos y. Mira el siguiente código:

self.timer = [NSTimer scheduledTimerWithTimeInterval: 2.0 objetivo: selector auto: @selector (runTimer) userInfo: repeticiones nil: YES];

 self.displayLink = [CADisplayLink displayLinkWithTarget: selector auto: @selector (runDipslay)];

temporizador y ha sido citado displaylink, pero también son fuertes referencia al mismo, formando de este modo una aplicación fuerte.

Entonces, ¿cómo referencias fuerte como para levantar esto?

Sobre temporizador podemos utilizar devoluciones de llamada en forma de bloque, y las referencias auto, después, en el bloque de tiempo, puede agregar __weak:

__weak typeof (auto) weakSelf = auto; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval: 2 repeticiones: bloque SI: ^ (NSTimer * temporizador _Nonnull) { 
        __strong typeof (weakSelf) strongSelf = weakSelf;
        si (! strongSelf) { 
            [invalidate temporizador]; 
            volver ; 
        } 
        [StrongSelf runTimer]; 
    }];

Pero CADisplayLink no proporciona devolución de llamada bloquear el camino, por lo que tenemos otra solución, esta solución es NSTimer y CADisplayLink principio general es utilizar :( mensaje mecanismo de reenvío)

Primero creamos una subclase NSProxy y luego añadir un débil Identificación del tipo de puntero, almacén de objetos para el reenvío de mensajes, mensajes y un mecanismo de reenvío implementadas NSProxy, de la siguiente manera:

.h
 @interface MyTargetProxy: NSProxy

 + (instanceType) weakProxyTarget :( ID ) objetivo; 

@end 


.m 
@interface MyTargetProxy () 

@property (, no atómica débil) Identificación del objetivo; 

@end 

@implementation MyTargetProxy

 + (instanceType) weakProxyTarget :( ID ) destino { 
    MyTargetProxy * de proxy = [MyTargetProxy alloc]; 
    proxy.target = objetivo;
    regresar de proxy; 
}

 - ( ID ) forwardingTargetForSelector: (SEL) Selector {
     retorno _target; //将消息转发给_target对象
}
- (NSMethodSignature * ) methodSignatureForSelector: (SEL) SEL { 
  // porque _target referencias debilidad, por lo que la situación puede ser nulo cuando target = nil, pasará aquí, aquí, no hemos creado un parámetro, hay maneras de firmas valor de retorno
retorno [el NSObject instanceMethodSignatureForSelector: @selector (init)]; } - ( void ) forwardInvocation: (NSInvocation * ) Invocación { void * a Nullpointer = NULL; [SetReturnValue Invocación: y un Nullpointer]; // aquí sólo tenemos que volver a cero } @end

Luego, cuando el uso de NSTimer como sigue:

MyTargetProxy * target = [MyTargetProxy weakProxyTarget: self]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval: 2 
                                                  objetivo: objetivo 
                                                selector: @selector (runTimer) 
                                                userInfo: nil 
                                                 repeticiones: YES];

Por último, recuerde auto delloc, llame al [invalidate self.timer], por lo que tenemos la solución perfecta para el problema de la circulación referencias NSTimer.

Acerca de por qué este MyTargetProxy para elegir heredado de NSProxy, podemos hacer clic aquí para entender.

Además, podemos ver se anota método forwardingTargetForSelector NSProxy, sobre la interpretación aquí, podemos hacer clic aquí para entender.

 

Supongo que te gusta

Origin www.cnblogs.com/zbblog/p/12555322.html
Recomendado
Clasificación