Какой объект вызвал метод другого объекта в Obj-C - PullRequest
0 голосов
/ 16 апреля 2010

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

Мой вопрос таков: возможно ли узнать (любую) информацию об объекте, который вызвал метод в контроллере. Когда инстанцированный плагин вызывает метод в моем контроллере плагина, я хотел бы знать, какой из плагинов вызвал метод, без необходимости полагаться на плагин, отправляющий указатель на себя в качестве параметра (я всегда мог проверить указатель, который они посылают , но я хочу, чтобы методы API были как можно проще).

Может не быть идеального решения (и есть простые обходные пути), но всегда полезно выучить некоторые новые уловки, если это возможно (или причины, по которым это невозможно).

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 17 апреля 2010

Это невозможно без обхода стека и, возможно, даже тогда. Нет даже гарантии, что данное сообщение было отправлено из метода - и даже если это так, это может быть не тот метод, который вы считаете «вызывающим». Например, если ваши плагины имеют доступ к Какао, ваши методы контроллера могут быть вызваны NSTimer.

В общем, это не практично. Обычный способ сделать это - заставить объекты обойти себя. Если вы пытаетесь сделать это по соображениям безопасности, вам все равно понадобится гораздо более надежное решение, поскольку объектная модель Cocoa не была разработана с учетом этого. Слишком легко объектам лгать о том, кто и что они.

0 голосов
/ 17 апреля 2010

Отправка ссылки на вызывающий объект - вот как это обычно делается. В качестве альтернативы, вы можете сделать так, чтобы ваш хост-код предоставлял прокси-объект для плагинов, с которыми можно общаться. По мере загрузки каждого плагина создайте новый прокси-объект для каждого из них.

0 голосов
/ 17 апреля 2010

Ну, вы могли бы сгенерировать исключение, поймать его и проверить его трассировку стека.

Предполагая, что Objective-C, конечно, поддерживает исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...