Действительно ли возможно использовать функции времени выполнения Objective C для определения, откуда метод назвали?

Вот некоторый автономный HTML/JS, который добивается цели:

<html>
  <head>
    <script type="text/javascript">
      function mkclr(cntl,clr) {
        document.getElementById(cntl).style.backgroundColor = clr;
      };
    </script>
  </head>
  <body>
    <form>
      <input type="textbox" id="tb1"></input>
      <input type="submit" value="Go"
        onClick="javascript:mkclr('tb1','red');">
      </input>
    </form>
  </body>
</html>
6
задан e.James 12 July 2009 в 02:17
поделиться

3 ответа

Не в среде выполнения. Все отправленные сообщения в конечном итоге завершаются вызовом функции в соответствии со строками objc_msgSend (получатель идентификатора, селектор SEL, / * аргументы метода * / ...) . Как видите, информация об объекте, отправляющем сообщение, не передается. Вероятно, можно определить вызывающий объект путем обхода стека, но в этом заключается безумие. Единственный практический способ узнать, кто вызвал метод, - дать ему аргумент отправитель , как и все методы IBAction.

11
ответ дан 8 December 2019 в 12:22
поделиться

Нет, вы не можете определить, какой объект вам звонил. Что ж, технически можно было бы обойти трассировку стека, но, конечно, это непрактично для реального кода.

Если вы посмотрите на большинство методов делегата, вы увидите, что стандартные форматы вызова делегата выглядят следующим образом :

- (NSSize) windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize;
- (BOOL) windowShouldClose:(id)window;
- (void) windowWillMove:(NSNotification *)notification;

Обратите внимание, как окно (вызывающий объект) передается в качестве первого аргумента, и как «окно» является первой частью имени метода. В последнем случае вызывающий окно неявно присутствует в NSNotification (notification.object - это окно).

2
ответ дан 8 December 2019 в 12:22
поделиться

You could try and derive your own class from NSInvocation that carries the caller information. Or wrap a class around NSInvocation reimplementing some of the calls in there.

2
ответ дан 8 December 2019 в 12:22
поделиться