2010-05-29 5 views
4

Мое первое сообщение здесь (нигде в этом отношении!), Re. Какао/Obj-C (я НЕ ДОПУСКАЮСЬ на любом из них, пожалуйста, будьте терпеливы!). Надеюсь, я уже не пропустил ответ, я попытался его найти.«Поиск» экземпляра объекта известного класса?

Я дошкольная процессуальная собака (не программирование с середины 80-х годов, поэтому я, вероятно, просто не могу даже узнать новые трюки), но у ООП голова крутится! Мой вопрос:

есть какие-либо средства на всех «открыть/найти/определить» экземпляр объекта известного класса, учитывая , что некоторые другие неизвестный процесс инстанцировали его?

eg. Somthing, что бы выполнить этот сценарий:

(id) anObj = [someTarget getMostRecentInstanceOf:[aKnownClass class]]; 

по этому вопросу, «getAnyInstance» или «getAllInstances» может сделать трюк тоже.

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

У меня есть заголовочные файлы SDK &, я знаю, какой класс является объектом, и какой метод мне нужно вызвать (он имеет только методы экземпляра), я просто не могу идентифицировать объект для таргетинга.

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

Так как я не может выразить свою проблему так ясно, как нужно, я положил на веб-страницу, с диаграммой & рабочие примеры страниц для иллюстрации:

http://www.nulltime.com/svtest/index.html

Любая помощь или руководство будет оценили! Благодарю.

ответ

1

Это невозможно без регистрации каждого экземпляра в словаре по мере его создания. I.e., переопределить некоторый общий заводский метод на более высоком уровне, который выполняет эту бухгалтерскую работу. Это будет падать, когда вы используете делегатов, которые вы не можете контролировать, помните об этом.

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

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

Edit:

Основываясь на диаграмме (мои извинения, только заметил ссылку после того, как я отправил этот ответ); Я бы предположил, что если вы контролируете классы, которые вам возвращают, просто добавьте к ним свойство. I.e., добавьте свойство «name», которое вы можете установить и сохранить уникальным. Затем просто передайте сообщение каждому экземпляру, проверяя, является ли этот объект тем, который вы хотите. Это не особенно умно или что-то в этом роде, но оно должно работать в ваших целях.

+0

Спасибо за быстрый ответ! Если я понимаю, вы, возможно, подтвердили мои худшие опасения. Если «управлять возвращаемыми классами» вы имеете в виду «класс A» и «класс B», я не контролирую их. Все, что у меня есть, - это файлы интерфейса (.h), предоставленные SDK приложения. Никаких файлов реализации для добавления чего-либо. Шон –

3

У меня есть файлы заголовков SDK &, я знаю, какой класс объект, и какой метод нужно вызвать (у него есть только методы экземпляра), я просто не могу идентифицировать объект для пристреливать.

Если это публично объявил класс с публично объявленными методами экземпляра (то есть, у вас есть заголовок для класса и имеют методы, например, в нем), то, вероятно, путь в API этого приложения, чтобы получить экземпляр класса. Либо вы должны создать его самостоятельно, либо приложение имеет один (или более) и предоставляет способ его получения (или их). Посмотрите как на заголовок для рассматриваемого класса, так и на другие заголовки.

Первоначально я сказал: «Должен быть способ ...», но я изменил его, потому что есть альтернативная причина, почему заголовок будет иметь методы экземпляра: Разработчик приложения не намеревается использовать эти методы экземпляра для использования плагина (и не маркировали их надлежащим образом), или не означает включение этого заголовка в приложение/SDK (они включали его случайно). Вы можете попросить разработчика приложения для руководства.

Если это не объявленный публично класс или его методы экземпляра не объявляются публично, то приложение не поддерживает работу с экземплярами класса. Это является нарушением контракта API - не юридического контракта, а ожиданий, что приложение имеет свои плагины. Если вы нарушите контракт API, вы будете вызывать неожиданное поведение либо сейчас (не обязательно на своем собственном компьютере/в ваших собственных тестах), либо в будущем.

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

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