Cómo entender NSRunLoop RunLoopMode
La función de NSRunLoop es hacer que el hilo NSRunLoop actual funcione cuando hay algo que hacer, y hacer que el hilo NSRunLoop actual duerma cuando no hay nada que hacer.
2.nstimer se agrega al NSRunLoop actual de forma predeterminada y también se puede agregar manualmente al NSRunLoop recién creado.
[NSTimer schduledTimerWithTimeInterval:target:selector:userInfo:repeats];
De forma predeterminada, este método se agrega al NSRunLoop actual.
NSTimer * timer =[NSTimer timerWithTimeInterval:invocación:repeticiones:];
NSTimer * timer =[[NSTimer alloc]initWithFireDate:...];
crear temporizador[[nsrunloop current unloop]add timer: timer for mode: nsrunlopconmodes];
Preste atención a la liberación del temporizador
3.NSRunLoop siempre está realizando la detección de bucle, desde el hilo Desde el principio hasta el final del hilo, detecta los eventos de sincronización de la fuente de entrada (como clic, doble clic, etc.) y detecta los eventos de sincronización de la fuente de tiempo. Cuando se detecta que la fuente de entrada ejecutará una función de procesamiento, primero generará una notificación y la función central agregará un observador de bucle de ejecución en el hilo para escuchar el evento que se va a procesar.
4.runloopmode es una colección que incluye monitoreo: fuentes de eventos, temporizadores y observadores de runloop a los que se les notificará.
Los modos incluyen:
Modo predeterminado: incluye casi todas las fuentes de entrada (excepto NSConnection) Modo NSDefaultRunLoopmode.
Modo modo: maneja el panel de modo.
Modo de conexión: maneja eventos NSConnection, pertenece al sistema y básicamente no es utilizado por los usuarios.
Modo de seguimiento de eventos: si un componente arrastra la fuente de entrada UITrackingRunLoopModes, no manejará eventos cronometrados.
Modos comunes: NSRunLoopCommonModes Este es un conjunto de modos comunes configurables. Al asociar una fuente de entrada con este modo, también se asocia la fuente de entrada con otros modos del grupo.
Cada vez que ejecuta un bucle de ejecución, especifica (explícita o implícitamente) el modo de ejecución del bucle de ejecución. Cuando el patrón correspondiente se pasa al ciclo de ejecución, solo se monitorean las fuentes de entrada correspondientes al patrón y el ciclo de ejecución puede manejar el evento (de manera similar, solo se notifica a los observadores correspondientes al patrón).
Ejemplo:
1). Cuando el temporizador y la tabla se ejecutan al mismo tiempo, cuando se arrastra la tabla, el runloop ingresa al modo UITrackingRunLoopModes y no procesará eventos cronometrados. En este momento, el temporizador no se puede procesar, por lo que el temporizador se agrega al modo NSRunLoopCommonModes (addTimer forMode).
2). Suelte el ratón al desplazarse por la página. En este punto, la conexión no recibirá mensajes. Debido a que el runloop está en UITrackingRunLoopModes cuando se desplaza, no recibe fuentes de entrada. En este punto, se debe modificar el modo de conexión.
[scheduleInRunLoop: [NSRunLoop currentRunLoop] para modo: NSRunLoopCommonModes];
5. Acerca de - (bool) modo de ejecución: (nsstring *) fecha anterior al modo: (nsdate *) fecha. ;Método
Especifica el modo de ejecución del ciclo para procesar fuentes de entrada y sale al final de la primera fuente de entrada o fecha.
Pausar el flujo de procesamiento actual y cambiar a otra fuente de entrada. Cuando la fecha se establece en [NSDate distantFuture] (un momento difícil de alcanzar en el futuro), nunca saldrá del flujo de procesamiento actualmente pausado hasta que finalice el procesamiento de otras fuentes de entrada.
Cuando (A){
[[ns run loop current unloop]modo de ejecución: NSDefaultRunLoopMode antes de la fecha: [ns fecha futuro lejano]];
}
Cuando la A actual es SÍ, el ciclo de ejecución actual siempre recibirá y procesará otras fuentes de entrada, y el proceso actual no continuará procesándose. Si A es No, el proceso actual continuará.
7. Los selectores de ejecución se serializan en subprocesos, lo que alivia muchos problemas de sincronización causados por la ejecución de múltiples métodos en el mismo subproceso. Después de ejecutar el selector, la fuente del selector de ejecución se elimina automáticamente del ciclo de ejecución.
Cuando el selector de ejecución está en un hilo no principal, debe haber un bucle de ejecución activo en su hilo. Para su propio hilo, el selector de ejecución solo se puede ejecutar después de que su código ejecute explícitamente un ciclo de ejecución. El bucle de ejecución procesa todos los selectores de ejecución en cola mientras se ejecuta el bucle, en lugar de procesar solo un selector de ejecución mientras se ejecuta el bucle.
8. El principio de ejecución del selector de rendimiento con respecto a la gestión de la memoria es el siguiente [selector de rendimiento propio: @ selector (Método 1:) con objeto: self. Capa de tabla después del retraso: 3];, el sistema agregará 1 al recuento de referencia de tableLayer. Después de ejecutar este método, se restará 1 del recuento de referencia de tableLayer. Debido al retraso, el recuento de referencias de tableLayer no se ha reducido a 0, lo que provoca que no se pueda llamar al método dealloc en el escenario de conmutación, lo que provoca una pérdida de memoria.
Usa las siguientes funciones:
[n object cancelPreviousPerformRequestsWithTarget: self]
Por supuesto, también puedes usarlas una por una:
[ns object cancelPreviousPerformRequestsWithTarget: self selector: @ selector (method 1:) object: nil]
Después de agregar esto, el método dealloc se ejecuta con éxito.
El contacto comienza
[selector de autoejecución: @ selector (método de pulsación larga:) con objeto: nulo después del retraso: tiempo de pulsación larga]
Luego haga The La decisión final fue cancelar.
Si no es lo suficientemente largo, haz una llamada por tiempo:
[ns object cancelPreviousPerformRequestsWithTarget:self selector:@selector(longPressMethod:)object:nil]
Cancela el método al principio p>
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * El siguiente es un resumen de lo que vi en cocoachina.
Varias formas de implementar subprocesos:
1. objetos de operación//n operación y subclases relacionadas
2.* * * *//dispatch _ async y otras funciones relacionadas
3. Notificación de tiempo de inactividad //cola de notificación ns, baja prioridad
3. Función asincrónica //Función asincrónica
4. /n temporizador
5. Proceso independiente //Nunca usado
Costo de creación de subprocesos:
La estructura de datos del kernel es de aproximadamente 1 KB.
Espacio de pila 512 KB (subproceso auxiliar)
1 MB (subproceso principal de iOS)
El tiempo de creación es de aproximadamente 90 microsegundos
Ejecutar bucle relación entre subprocesos:
1. El bucle de ejecución del subproceso principal se inicia de forma predeterminada y se utiliza para recibir varias fuentes de entrada.
2. Para el segundo hilo, el ciclo de ejecución no se inicia de forma predeterminada. Si se requiere más interacción de subprocesos, se puede configurar e iniciar manualmente. Si el hilo realiza una tarea que se ha determinado durante mucho tiempo, no es necesario.
Cuándo usar un bucle de ejecución:
A. Usar un puerto o fuente de entrada para comunicarse con otros subprocesos // No lo entiendo.
B. Uso de temporizadores en subprocesos //Si el ciclo de ejecución no se inicia, el evento del temporizador no responderá.
C. Utilice el método selector de rendimiento... // debería ser performSelector... Este método iniciará un subproceso e iniciará el ciclo de ejecución, ¿verdad?
D. Deje que el hilo realice tareas periódicas // Si no inicia el ciclo de ejecución, el sistema puede liberar el hilo después de la ejecución.
Nota: El temporizador debe crearse y liberarse en el mismo hilo.
[[NSRunLoop current unloop]add timer: timer for mode: NSRunLoopCommonModes];
//////////////////////////////////////////// // ///////////////////////////////////////////////// ////// ///////////////////////////////////////////// ////////// /////////
La siguiente es una demostración de CFRunLoop para ayudar a comprender su uso:
/!! ! Si no hay un currentLoop a continuación, el temporizador en el método initPlayer no se ejecutará, es decir, se completará playerThread.
- (nulo) Hilo del reproductor: (id) no utilizado
{
bucle actual = CFRunLoopGetCurrent() // Referencia de runloop del hilo secundario< / p>
NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init] //Crea un grupo de liberación automática para subprocesos secundarios.
[reproductor de inicio automático];
CFRunLoopRun();
[liberación del grupo]; >-(void) initPlayer
{
//Aquí puede inicializar una clase de trabajo, como la reproducción de sonido o video.
[NSTimer programmingTimerWithTimeInterval: 3.0 target: self
selector: @selector(checkState:)userInfo: nil repeticiones: YES];
}
-(void) Verificar estado: (NSTimer*) temporizador
{
//Es necesario salir del hilo personalizado.
//if()
//{
//Liberar recursos en el hilo secundario.
//Código para liberar recursos....
/*Finalizar la tarea del subproceso cfrunloopstop. Esta función obliga a rl a dejar de ejecutarse y.
Devuelve el control a la función que llama a CFRunLoopRun o CFRunLoopRunInMode
para la activación del ciclo de ejecución actual. Si los bucles de ejecución están anidados con anotaciones
de una activación a otra, solo el más interno
sale de la activación. */
//CFRunLoopStop(bucle actual);
//}
for(int I = 0; ilt100; i)
{
NSLog(@"d",I);
}
//CFRunLoopStop finalizará el temporizador actual. Si el ciclo de ejecución no termina, el cronómetro se repetirá.
CFRunLoopStop(bucle actual);
}
-(void)Clic: (id)Remitente{
NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(player thread:)object:nil];
//Iniciar el hilo. Si está utilizando NSOperation, solo necesita unirse a NSOperationqueue. La cola ejecuta subprocesos en el momento adecuado sin control del programador.
[Inicio del hilo];
}
- (void)viewDidLoad
{
[Super viewDidLoad ];
[self . ver setfondo color: [ui color color blanco]];
botón ui * botón =[[botón ui alloc]initWithFrame: CGRectMake(10, 10, 100, 50)];
[botón establecer color de fondo: [color de interfaz de usuario color azul]];
[botón setTitle: @ "ABC " para estado: UIControlStateNormal]; p>
p>
[color del título del botón: [color blanco de la interfaz de usuario] para el estado: UIControlStateNormal];
[color del título del botón: [color rojo de la interfaz de usuario] para el estado: uicontrolstatehighted] ;
[botón establecer color de fondo: [color de interfaz de usuario color azul]];
[botón agregar destino: acción propia: @selector(clic:)para eventos de control: UIControlEventTouchDown];
[self.view addSubview:button];
[Soltar botón];
}