Путаница с MKOverlayView

Я работал со слоями для MapKit на iPhone, и мне попалась одна библиотека: https://github.com/mtigas/iOS-MapLayerDemo/. Это очень полезно, и, кажется, работает нормально. Тем не менее, я пытаюсь пройти и немного понять, как это работает, но у меня возникли некоторые проблемы.

Например, на этой странице: https://github.com/mtigas/iOS-MapLayerDemo/blob/master/MapLayerDemo/Classes/CustomOverlayView.m, вверху определены 4 пользовательские функции. Я предполагаю, что эти функции добавляются к обычным функциям MKOverlayView? Дело в том, что я не могу найти, откуда на самом деле вызывается какая-либо из этих новых функций, и поэтому у меня возникли проблемы с пониманием того, как работает эта страница. Кажется, это не из каких-либо других файлов в проекте.

Я ценю любую помощь, спасибо.


person Doug M.    schedule 26.07.2011    source источник
comment
просмотрев проект, они не вызываются ниоткуда, насколько я могу видеть, возможно, стоит добавить несколько операторов журнала, чтобы увидеть, вызываются ли они вообще? возможно, это просто полезные функции, оставленные для вашего удобства, но они не нужны для запуска проекта.   -  person MCannon    schedule 26.07.2011
comment
Спасибо за ответ. Они действительно вызываются из проекта, но убей я не могу понять, откуда.   -  person Doug M.    schedule 26.07.2011


Ответы (1)


После продолжительного обсуждения с вами в комментариях:

Переопределяемые функции MKOverlayView, такие как canDrawMapRect, не могут быть легко отслежены до их вызывающего кода, потому что этот код запутан где-то в MapKit.framework.

Вместо этого типичный подход состоит в том, чтобы перечитать их документацию, пока вы не получите ментальную картину того, для чего фреймворк использует эту функцию. (Существует такая вещь, как декомпиляция двоичных файлов, хотя это обычно не одобряется, и я не рекомендую это делать.)

canDrawMapRect документация: http://developer.apple.com/library/ios/documentation/MapKit/Reference/MKOverlayView_class/Reference/Reference.html#//apple_ref/doc/uid/TP40009715-CH1-SW10

Прочитав их документацию, я пришел к следующему выводу: где-то в MapKit.framework canDrawMapRect вызывается до фактического рисования вида. Если вы не переопределили эту функцию в своем подклассе, она вызывает реализацию суперкласса по умолчанию, которая всегда возвращает YES, а затем вызывает drawMapRect: (которое ДОЛЖНО быть переопределено, если вы создаете подкласс MKOverlayView, иначе ничего не будет отображаться!)

Класс, который вы связали выше, потенциально возвращает NO. В этом конкретном случае код в MapKit.framework пропускает вызов drawMapRect: и ничего не отображается (или не обновляется).

Итак, короче говоря: в этом случае вы должны играть в детектива по коду и надеяться, что документация написана достаточно ясно, чтобы понять это, не имея возможности видеть весь код.

Изменить: просто для дальнейшего уточнения. Похоже, что MKOverlayView должен быть подклассом, чтобы фактически генерировать что-то видимое.


Мой первоначальный ответ, прежде чем перейти к вашему основному вопросу -

Краткий ответ: это частные функции для использования в этом классе.

Длинный ответ: функции, объявленные в категории с пустым именем в верхней части файлов реализации, видны только классу, который расширяет категория. Таким образом, эти функции можно вызывать только внутри реализации этого класса. (эквивалент С++ просто объявлял бы функции закрытыми)

3 из этих 4 функций вызываются в одном и том же файле .m. Не копаясь, я предполагаю, что они написали первую функцию, а затем решили ее не использовать.

person MechEthan    schedule 26.07.2011
comment
Спасибо за ответ. Ну, они определены в файле .m, но откуда в проекте они на самом деле вызываются? - person Doug M.; 26.07.2011
comment
Да, но это всего лишь определения для функций... разве сначала их не нужно где-то вызывать, а не просто определять? - person Doug M.; 26.07.2011
comment
Да, но это внутри другой функции, которая нигде не вызывается. Другими словами, где вызывается canDrawMapRect, который вызывает zoomLevelForZoomScale? - person Doug M.; 26.07.2011
comment
Я считаю, что они вызываются внутри структуры в ответ на отображение событий перерисовки и тому подобное. CanDrawMapRect CustomOverlayView переопределяет функциональность MKOverlayView. См. developer.apple.com/library/ ios/#documentation/MapKit/Reference/ для получения дополнительной информации о том, что делает переопределение этих функций. - person MechEthan; 27.07.2011
comment
Спасибо -- я уже читал эту страницу, и не похоже, чтобы MKOverlayView.h вообще имел эти функции, вот что меня смущает. - person Doug M.; 27.07.2011
comment
Похоже, вы путаетесь где-то между тем, как работают переопределяющие функции в подклассах существующих классов Cocoa, и тем, как представления в Cocoa могут диктовать свое собственное поведение рисования. Я не уверен, что смогу лучше объяснить это через систему комментариев StackOverflow. Мне жаль! - person MechEthan; 27.07.2011
comment
Хм... так можно ли точно увидеть, где именно вызывается эта первая функция, или это скрыто от нас, разработчиков? - person Doug M.; 27.07.2011
comment
Ааа, я наконец понял ваш вопрос! Удалил некоторые из моих запутанных комментариев, разместив ответ в моем ответе. - person MechEthan; 27.07.2011