wait_fences: no se pudo recibir la respuesta: 10004003 (de nuevo)

Otro grito de ayuda sobre esta advertencia.

En primer lugar, he analizado todas y cada una de las preguntas aquí en otro lugar y ninguna parece encajar en mi situación. No tiene nada que ver con los cuadros de alerta y renunciar como primer respondedor, ni realizar ninguna animación antes de que se muestren las vistas. Mi problema ocurre al crear instancias de un teclado personalizado basado en UIView.

En segundo lugar, creo que puedo hacer que la advertencia aparezca / desaparezca a voluntad. Estoy muy confundido sobre por qué, así que estoy buscando más una explicación que una solución.

Hay demasiado código para publicar aquí, así que solo daré un resumen de lo que está sucediendo:

El ViewController "Calc" crea una instancia de "DataView" personalizado basado en UIView en el método loadView del VC, y luego lo agrega como una vista secundaria del VC.

El "DataView" crea una instancia de "TextFieldKPD" basado en UITextField personalizado en el método init de DataView

El "TextField" crea una instancia de "KeyPad" personalizado basado en UIView en el método init del TextField, y asigna ese KeyPad al inputView de TextField.

El "Teclado" crea 13 botones UIB de tipo UIButtonTypeCustom, lee y asigna una imagen "presionada" y "no presionada" para cada botón, además de establecer acciones para los botones. Luego agrega cada botón como una subvista de sí mismo. (Al controlar cuándo se produce esta construcción en el ciclo de vida UIView del KeyPad, así es como puedo efectuar la advertencia wait_fences: ver más abajo).

El "Calc" ViewController es el que se presenta inicialmente al usuario. He rastreado la advertencia wait_fences que ocurre después del final del método viewDidLayoutSubViews de Calc y antes de que se llame a su método viewDidAppear. Tenga en cuenta que el teclado no está visible cuando se muestra el Calc.

Parece que puedo controlar la acción de la advertencia wait_fences cambiando la forma en que se construye el teclado:

Si las UIButtons se instancian y agregan como subvistas en el método init del KeyPad, recibiré la advertencia, solo una vez.

Si, en cambio, los botones se crean instancias y se agregan en el método layoutSubViews del KeyPad, entonces la advertencia no aparece. (Pero el KeyPad no se construye efectivamente hasta que toco el TextField; aún así, tampoco hay advertencia wait_fences)

No hay animación ni nada en la vista de carga de Calc. Es instanciar y asignar todo el camino hacia abajo.

¿Entonces algún comentario sobre esta versión de wait_fences?

EDIT 1, 30 de enero - ¡Ahora con aún más confusión!

Me aburrí esta mañana, así que decidí jugar con mi código para ver si podía aislar mejor la generación de la advertencia. Lo reduje al siguiente código totalmente inútil con el que ahora puedo activar la advertencia:

-(void)loadImages
{
    UIImage* image;

    for(int i=0; i<16; i++) {
        image = [UIImage imageNamed:@"StupidFileNameThatDoesNotExist"];
    }
}

Si realizo[self loadImages] en el método init deKeyPad entonces aparece la advertencia. Pero este código no hace nada ya que el archivo no existe. Creo que si el contador de bucle es lo suficientemente pequeño como para que la advertencia desaparezca, pero no he calificado un límite inferior.

Si reemplazo la carga real de la imagen con

[UIImage imageWithContentsOfFile:@"StupidFileNameThatDoesNotExist"]

y aún llamar al método durante elKeyPad init, parece que no recibo la advertencia. Una diferencia obvia entre estas dos formas de cargar la imagen es queimageNamed almacena en caché la imagen internamente.

Así que me inclino hacia la respuesta de George de que es un error interno de Apple.

Editar 2, 1 de febrero - Es una advertencia Jim, pero no como lo conocemos

Así que me convencí de que era el almacenamiento en caché en la clase UIImage lo que obviamente estaba causando el problema. ¿Qué hacer al respecto? Bueno, por supuesto, escribir mi propio caché de imágen

Así que comencé a desconectarme, arranqué ese código que intentaba cargar imágenes no válidas y obtuve el punto donde generé los nombres de archivo que necesitaba y los pasé a mi controlador de caché. Entonces, para verificar que las cosas comenzaran a juntarse, dentro del controlador de caché, generé un mensaje NSLog para cada intento de almacenar en caché una imagen, nada más, solo registre el nombre del archivo.

Y adivina qué: recibo la estúpida advertencia nuevamente. Por no hacer ningún trabajo real en absoluto.

Solo puedo concluir que hay algún tipo de condición interna de carrera de iOS que estoy activando cuando introduzco código adicional en el método init deKeyPad. Y que no hay nada que pueda hacer para mitigarlo. Todo lo que puedo hacer es esperar que esta advertencia sea benigna.

Edit 3, Hamlet Act 1 escena 4: Algo está podrido en el estado de Dinamarca

Manteniendo el mismo código que en Edit 2, comenté la declaración NSLog. Y la advertencia se fue. Lo puse de nuevo y aparece la advertencia.

Así que el código que tengo es:

-(void)loadImages
{
    // Iterate over button definitions and cache the required images
    for(int i=0; i<numKeys; i++) {

        if (![imageCache imageExistsForTag:keyTags[i]]) {
            [imageCache addImageFile:[NSString stringWithFormat:@"%s_NP.png",keyNames[i]] forTag:keyTags[i]];
        }

        if (![imageCache imageExistsForTag:keyTags[i]+pressedOffset]) {
            [imageCache addImageFile:[NSString stringWithFormat:@"%s_P.png",keyNames[i]] forTag:keyTags[i]+pressedOffset];
        }

    }

}

Y

-(void)addImageFile:(NSString*)imageFile forTag:(int)tag
{
    NSLog(@"Adding tag:%d for file %@", tag, imageFile);
}

Con esa declaración NSLog que controla la apariencia de la advertencia.

Editar 4, 2 de febrero - Bienvenido al Templo de la Perdición

Tomando en serio los comentarios de Allen, reconstruí mi teclado como XIB y lo cargué en lugar de intentar crear manualmente la vista. Por supuesto que eso no solucionó nada. Esperaba que la carga de Nib ocurriera fuera de lo que sea que esté causando el problema.

Mi intuición es que me estoy enfrentando a una condición de carrera dentro de loadView de Calc y alguna actividad interna de iOS. Si trabajo demasiado dentro de loadView, entonces cruzo la línea y disparo una advertencia wait_fences. Y que el teclado es un síntoma y no la causa subyacente. Es decir, podría haber sido cualquier actividad, era solo que el trabajo con el teclado fue lo último que hice antes de que apareciera la advertencia. Solo desearía saber cuáles eran las restricciones que realmente estaba cruzando y no tropezar en la oscuridad.

Respuestas a la pregunta(10)

Su respuesta a la pregunta