wait_fences: falha ao receber a resposta: 10004003 (Novamente)

Outro pedido de ajuda sobre este avis

Primeiro de tudo, eu olhei para todas as perguntas aqui em outros lugares e nenhuma parece se encaixar na minha situação. Não tem nada a ver com as caixas de alerta e com a demissão como primeiro respondedor, nem com a execução de qualquer animação antes das exibições serem exibidas. Meu problema ocorre ao instanciar um teclado personalizado baseado em UIVie

Em segundo lugar, acredito que posso fazer o aviso aparecer / desaparecer à vontade. Estou muito confuso quanto ao motivo, então estou procurando mais uma explicação do que uma soluçã

Há muito código para postar aqui, então vou dar uma descrição geral do que está acontecendo:

O ViewController "Calc" instancia um "DataView" baseado em UIView personalizado no método loadView do VC e o adiciona como uma sub-visualização do V

O "DataView" instancia um "TextFieldKPD" baseado em UITextField personalizado no método init do DataView

O "TextField" instancia um "KeyPad" baseado em UIView personalizado no método init do TextField e atribui esse KeyPad ao inputView do TextField.

O "KeyPad" cria 13 UIButtons do tipo UIButtonTypeCustom, lê e atribui uma imagem "pressionada" e "não pressionada" para cada botão, além de definir ações para os botões. Em seguida, adiciona cada botão como uma subvisão de si mesmo. (Controlando quando, no ciclo de vida do UIView do KeyPad, essa construção ocorre, é como eu posso efetuar o aviso wait_fences: veja abaixo.)

O ViewController "Calc" é o que é apresentado inicialmente ao usuário. Rastreei o aviso wait_fences como ocorrendo após o final do método viewDidLayoutSubViews do Calc e antes que o método viewDidAppear seja chamado. Observe que o teclado não é visível quando o Calc é exibid

Parece que sou capaz de controlar a ação do aviso wait_fences alterando a forma como o teclado é construído:

Se os UIButtons forem instanciados e adicionados como subvisões no método init do KeyPad, receberei o aviso apenas uma vez e uma ve

Se, em vez disso, os botões forem instanciados e adicionados ao método layoutSubViews do KeyPad, o aviso não será exibido. (Mas o KeyPad não é efetivamente construído até eu tocar no TextField - ainda assim, nenhum aviso de wait_fences também)

Não há animação nem nada no loadView do Calc. É instanciado e atribuído até o fi

Tem algum comentário sobre esta versão do wait_fence

EDIT 1, 30 de janeiro - Agora com ainda mais confusão!

Fiquei entediado esta manhã, então decidi brincar com meu código para ver se conseguia isolar melhor a geração do aviso. Eu reduzi o código para o seguinte, totalmente inútil, com o qual agora posso acionar o aviso:

-(void)loadImages
{
    UIImage* image;

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

Se eu executar[self loadImages] no método init deKeyPad então o aviso aparece. Mas esse código não faz nada, pois o arquivo não existe. Acredito que se o contador de loop for pequeno o suficiente para que o aviso apareça, mas eu não qualifiquei um limite inferio

Se eu substituir o carregamento real da imagem por

[UIImage imageWithContentsOfFile:@"StupidFileNameThatDoesNotExist"]

e ainda chame o método durante oKeyPad init, parece que não recebo o aviso. Uma diferença óbvia entre essas duas maneiras de carregar a imagem é queimageNamed armazena em cache a imagem internament

Então, estou me inclinando para a resposta de George de que é um estrago interno da Appl

Edit 2, 1 fev - É um aviso Jim, mas não como o conhecemos

Então eu me convenci de que era o cache na classe UIImage que obviamente estava causando o problema. O que fazer sobre isso? Bem, é claro que escrevo meu próprio cache de imagens

Então, comecei a desconectar, rasguei o código que tentava carregar imagens inválidas e cheguei ao ponto em que gerei os nomes de arquivos necessários e os passei para o meu controlador de cache. Portanto, para verificar se as coisas estavam começando a se unir, dentro do controlador de cache, gerei uma mensagem NSLog para cada tentativa de armazenar em cache uma imagem - nada mais - apenas registre o nome do arquiv

E adivinhem - recebo o aviso estúpido novamente. Por não fazer nenhum trabalho rea

Só posso concluir que há algum tipo de condição de corrida interna para iOS que estou acionando quando codifico código extra no método init deKeyPad. E que não há nada que eu possa fazer para mitigá-lo. Tudo o que posso fazer é esperar que esse aviso seja benign

Edit 3, Hamlet Act 1 cena 4: Algo está podre no estado da Dinamarca

Mantendo o mesmo código que no Edit 2, comentei a instrução NSLog. E o aviso foi embora. Coloquei de volta e o aviso aparece.

Então o código que tenho é:

-(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];
        }

    }

}

E

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

Com essa instrução NSLog que controla a aparência do avis

Edit 4, 2 de fevereiro - Bem-vindo ao Templo da Perdição

Tirando o coração dos comentários de Allen, reconstruí meu teclado como um XIB e carreguei-o em vez de tentar criar a exibição manualmente. Claro que isso não consertou nada. Eu esperava que o carregamento da ponta acontecesse fora do que está causando o problem

Meu pressentimento é que estou lutando contra uma condição de corrida no loadView do Calc e em algumas atividades internas do iOS. Se eu fizer muito trabalho dentro do loadView, atravesso a linha e aciono um aviso de wait_fences. E que o teclado é um sintoma e não a causa subjacente. Ou seja, poderia ter sido qualquer atividade, apenas o trabalho com o teclado foi a última coisa que fiz antes do aviso começar. Eu só queria saber quais eram as restrições que eu estava atravessando e não tropeçando no escuro.

questionAnswers(10)

yourAnswerToTheQuestion