Como descobrir quem chamou um método?

Exemplo: Quando meu método -fooBar é chamado, quero que ele faça o login no console, outro método do qual outra class o chamou.

Agora, só sei como registrar o nome do método do fooBar em si e sua class, com isto:

_cmd [self class] 

Isso é possível descobrir?

Em código totalmente otimizado, não há 100% de modo seguro para determinar o chamador para um determinado método. O compilador pode empregar uma otimização de chamada final, enquanto o compilador efetivamente reutiliza o quadro de pilha do chamador para o receptor.

Para ver um exemplo disso, defina um ponto de interrupção em qualquer método usando o gdb e observe o backtrace. Note que você não vê objc_msgSend () antes de cada chamada de método. Isso porque o objc_msgSend () faz uma chamada final para a implementação de cada método.

Embora você possa compilar seu aplicativo não otimizado, você precisaria de versões não otimizadas de todas as bibliotecas do sistema para evitar apenas esse problema.

E isso é apenas um problema; na verdade, você está perguntando “como eu reinvento o CrashTracer ou o gdb?”. Um problema muito difícil sobre quais carreiras são feitas. A menos que você queira que “ferramentas de debugging” sejam sua carreira, eu recomendaria não seguir esse caminho.

Que pergunta você está realmente tentando responder?

Como sobre isso :

 NSString *sourceString = [[NSThread callStackSymbols] objectAtIndex:1]; NSCharacterSet *separatorSet = [NSCharacterSet characterSetWithCharactersInString:@" -[]+?.,"]; NSMutableArray *array = [NSMutableArray arrayWithArray:[sourceString componentsSeparatedByCharactersInSet:separatorSet]]; [array removeObject:@""]; NSLog(@"Class caller = %@", [array objectAtIndex:3]); NSLog(@"Method caller = %@", [array objectAtIndex:4]); 

Créditos ao autor original, intropedro .

Não é possível no caso geral sem realmente andar na pilha. Não há garantia de que outro object envie a mensagem que chamou o método. Por exemplo, poderia ser chamado de um bloco em um manipulador de sinal.

Veja backtrace (3) .

Usuário o método abaixo
Passar índice para o qual você deseja exibir o método e passar -1 se quiser exibir a pilha completa do método

 +(void) methodAtIndex:(int)index{ void* callstack[128]; int frames = backtrace(callstack, 128); char** strs = backtrace_symbols(callstack, frames); if (index == -1) { for (int i = 0; i < frames; ++i) { printf("%s\n", strs[i]); } } else { if (index < frames) { printf("%s\n", strs[index]); } } free(strs); } 
 NSLog(@"Show stack trace: %@", [NSThread callStackSymbols]); 

Essas informações podem ser obtidas usando o DTrace .

Crie uma macro que adicione __FUNCTION__ ao nome da function à chamada de function. Esta macro irá então chamar sua function com um parâmetro extra de um char * para a function alvo.

Eu estava tentando pegar quem, como e quando muda o tamanho da janela e fiz alguns trabalhos manuais:

 - (void)logWindowWidth:(NSString *)whoCalls { NSLog(@"%@", whoCalls); NSLog(@"self.window.size.width %f", self.window.size.width); } -(void)someMethod { [self logWindowWidth:@"someMethod - before"]; ... [self logWindowWidth:@"someMethod - after"]; } -(void)anotherMethod { [self logWindowWidth:@"anotherMethod - before"]; ... [self logWindowWidth:@"anotherMethod - after"]; }