Eu quero usar um seletor em uma instância NSObject sem a necessidade de um protocolo implementado. Por exemplo, há um método de categoria que deve definir uma propriedade de erro se a instância NSObject em que é chamada oferecer suporte. Este é o código, e o código funciona como pretendido:
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
No entanto, o compilador não vê nenhum método com a assinatura setError:, portanto, é exibido um aviso para cada linha que contém o @selector(setError:)
trecho:
Undeclared selector 'setError:'
Não quero declarar um protocolo para se livrar desse aviso, porque não quero que todas as classes que possam usar isso implementem algo especial. Apenas por convenção, quero que eles tenham um setError:
método ou propriedade.
Isso é factível? Quão?
Saúde,
EP
objective-c
selector
categories
epologado
fonte
fonte
Respostas:
Outra opção seria desativar o aviso com:
Você pode colocar essa linha no arquivo .m onde ocorre o aviso.
Atualizar:
Também funciona com o LLVM assim:
fonte
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// Do your thing
#pragma clang diagnostic pop
#pragma clang diagnostic ignored "-Wselector"
Dê uma olhada no NSSelectorFromString .
Isso permitirá que você crie um seletor em tempo de execução, em vez de em tempo de compilação, através da
@selector
palavra - chave, e o compilador não terá chance de reclamar.fonte
sel_registerName()
olhares thingy obscurecer e do tipo que você não deve ser chamado diretamente a menos que você saiba o que está fazendo, um bocado como obj_msg_send ();)Eu acho que isso ocorre porque, por algum motivo estranho, o seletor não está registrado no tempo de execução.
Tente registrar o seletor via
sel_registerName()
:fonte
NSSelectorFromString
liga desel_registerName()
qualquer maneira. Escolha o que melhor lhe convier.sel_registerName()
diretamente é mais explícito sobre o motivo de você estar fazendo isso.NSSelectorFromString
não diz que ele tentará registrar o seletor.Eu recebi essa mensagem # # incluindo o arquivo com o método Nada mais foi usado nesse arquivo.
fonte
Sei que estou um pouco atrasado para este segmento, mas, para ser completo, você pode desativar globalmente esse aviso usando as configurações de criação de destino.
Na seção 'Avisos do Apple LLVM - Objective-C', altere:
fonte
Se sua classe implementar o método setError: (mesmo declarando dinâmico o configurador da propriedade de erro eventual), você poderá declará-lo em seu arquivo de interface (.h) ou se não gostar de mostrá-lo dessa maneira tente com o truque complicado PrivateMethods:
imediatamente antes da sua implementação, isso deve ocultar os avisos;).
fonte
PerformSelector may cause a leak because its selector is unknown
A macro muito confortável para colocar em seu
.pch
ouCommon.h
ou onde quer que você quer:É uma edição desta pergunta para um problema semelhante ...
fonte
Você pode desativá-lo no Xcode, como na captura de tela:
fonte
Você também pode converter o objeto em questão em um ID primeiro para evitar o aviso:
fonte
Outra maneira de evitar esse aviso é garantir que o método seletor fique assim:
Não se esqueça de "(id) remetente" se você deseja aceitar qualquer remetente ou, se preferir, especifique um tipo de objeto remetente.
fonte
Enquanto a resposta correta provavelmente está em informar o Xcode através de importações ou registrar o seletor de que esse seletor existe, no meu caso, estava faltando um ponto e vírgula. Antes de "corrigir" o erro, verifique se o erro está correto e seu código não. Encontrei o erro no exemplo MVCNetworking da Apple, por exemplo.
fonte
Consegui que o aviso fosse embora adicionando outro método (divulgação: não pensei nisso, mas o encontrei pesquisando no timer programado com intervalo de tempo)
Embora eu aprecie saber como ocultar o aviso, corrigi-lo é melhor e nem as técnicas de Sergio nem Relkin funcionaram para mim, por razões desconhecidas.
fonte