2012-06-20 2 views
0

У меня есть функция myFunc() в классе A. Существует несколько других классов, вызывающих эту функцию.Определение класса, вызывающего функцию - iOS, объект C

Как я могу узнать, какой класс вызывает myFunc() в конкретном экземпляре?

Может кто-нибудь сможет мне помочь?

+0

Возможный дубликат [Objective C find caller of method] (http://stackoverflow.com/questions/1451342/objective-c-find-caller-of-method) –

ответ

1

Концептуально эта информация доступна в стеке, хотя добраться до нее непросто. Большинство решений предполагали создание исключения для захвата трассировки стека, а затем чтение трассировки. Я не пробовал, но это может работать:

void myFunc() 
{ 
    NSArray *stack = [NSThread callStackSymbols]; 
    // I have no idea if the current function call is at the 0 or last position 
    // of the array. Experiment here! 
} 

Соответствующая документация: NSThread Class Reference

Обратите внимание, что если вы хотите, чтобы функция вести себя по-разному в зависимости от того, кто звонит, НЕ ДЕЛАЙТЕ ЭТОГО. Это хрупкий (нет никаких гарантий относительно того, изменится ли формат того, что возвращает callStackSymbols).

Лучше просто передать параметр в вашу функцию. Если вы имеете дело с API обратного вызова C-функции, обычно существует параметр «context» или «info» void *, который вы можете использовать для передачи произвольного указателя. Это может быть указатель на ваш объект.

+0

Это хороший инструмент для отладки. –

1

Используйте паттерн Visitor

  1. У каждого из классов вызовов реализовать общий протокол, который определяет интерфейс поведения вы надеетесь достичь.
  2. Добавить протокол в качестве параметра myFunc.
  3. При вызове myFunc() в качестве параметра укажите self.
  4. myFunc теперь может ссылаться на любой из методов протокола, не зная о других конкретных классах.

Таким образом, вы придерживаетесь понятий инкапсуляции.

Смежные вопросы