Atualmente, estamos nos definindo um mecanismo de log estendido para imprimir o nome da classe e o número da linha de origem do log.
#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
__LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
Por exemplo, quando eu chamo NCLog (@ "Hello world"); A saída será:
<ApplicationDelegate:10>Hello world
Agora também quero sair do nome do método como:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Portanto, isso tornaria nossa depuração mais fácil quando podemos saber qual método está sendo chamado. Eu sei que também temos o depurador do Xcode, mas às vezes também quero fazer a depuração efetuando logout.
objective-c
c
iphone
debugging
vodkhang
fonte
fonte
iPhone
projeto, eu fiz isso manualmente. Adoraria ver a resposta para isso.Respostas:
Swift 3 e acima
fonte
NSLog(@"%@", NSStringFromSelector(_cmd))
, se for usar_cmd
, uma vez que o AFAIK Apple declara_cmd
como tipoSEL
, não uma string C. O fato de ser implementado como uma corda C (nas versões atuais do Mac OS X e do iPhone OS) não significa que você deva usá-lo dessa maneira, pois a Apple pode alterá-lo em uma atualização do sistema operacional.[self doSomething:arg1 somethingElse:arg2]
get convertido na chamada de função Cobjc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);
. O segundo parâmetro deobjc_msgSend()
leva achar*
. Lembre-se de que, como o tempo de execução do Objective-C é dinâmico, na verdade ele está usando uma tabela de pesquisa para descobrir qual método em qual classe chamar, portanto, um char * é conveniente, pois os métodos são representados como seqüências de caracteres na tabela de pesquisa.print("\(#function)")
Para responder tecnicamente à sua pergunta, você deseja:
Ou você também pode fazer:
fonte
__FUNCTION__
e seu equivalente equivalente também estão disponíveis nas funções C.__FUNCTION__
também inclui o nome da classetl; dr
Detalhes
A Apple possui uma página de Perguntas e respostas técnicas: QA1669 - Como posso adicionar informações de contexto - como o método atual ou o número da linha - às minhas instruções de registro?
Para ajudar no log:
_cmd
Como outras respostas indicadas, para obter apenas o nome do método atual, chame:
Para obter o nome do método atual e o número da linha atual, use estas duas macros
__func__
e__LINE__
como visto aqui:Outro exemplo ... Trechos de código que mantenho na Biblioteca de trechos de código do Xcode:
… E TRACE em vez de ERRO…
… E uma versão mais longa usando uma descrição codificada por software passando um valor (
[rows count]
)…Macros de pré-processador para log
Observe o uso de um par de caracteres sublinhados nos dois lados da macro.
Expressões para log
Estruturas de registro
Algumas estruturas de registro também podem ajudar a obter o método atual ou o número da linha. Não tenho certeza, pois usei uma excelente estrutura de log em Java ( SLF4J + LogBack ), mas não o Cocoa.
Consulte esta pergunta para obter links para várias estruturas de registro de cacau.
Nome do Seletor
Se você tiver uma variável Seletor (um SEL ), poderá imprimir o nome do método ("mensagem") de duas maneiras, conforme descrito nesta postagem do blog do Codec :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
Essas informações foram extraídas da página de documento da Apple vinculada a partir de 19/07/2013. Essa página foi atualizada pela última vez em 10/10/2011.
fonte
sel_getName(SEL)
desde SEL é um tipo opaco e pode nem sempre ser umchar *
fonte
Na verdade, é tão simples quanto:
Por alguma razão, o iOS permite que _cmd seja transmitido como um caracter literal, sem sequer um aviso de compilação. Quem sabe
fonte
No Swift 4:
func test () {
}
test () // imprime o valor "test ()"
fonte