Отладка UIViews пропускает член subviews в списке переменных отладчика - PullRequest
1 голос
/ 01 сентября 2009

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

Я вижу только эти поля в отладчике (> должен обозначать открывающий треугольник ):

  • UIResponder

  • _layer

  • _tabInfo

  • _gestureInfo

  • _touchData

  • _charge
  • _tag
  • _viewFlags

Я скучаю по члену _subviews и думаю об этом также обо всех позиционных членах (по крайней мере, один из них должен быть там).

Кто-нибудь знает, что я пропускаю или делаю неправильно (насколько я могу судить, это не проблема, так как поиск Google по этой проблеме не дал мне никаких результатов).

Я использую Xcode версии 3.1.3 с:

  • XcodeIDE: 1191.0
  • XcodeCore: 1192.0
  • XcodeSupport: 1186.0

на Mac с OS 10.5.7 и iPhone SDK 2.2.1 (я также тестировал с iPhone SDK 3.0).

Надеюсь, кто-нибудь что-нибудь знает об этом. Это вызывает у меня странное чувство, что я не могу доверять отладчику, чтобы показать мне все, что я должен знать для устранения проблемы. И это не хорошо, если вам не нужно доверять своим инструментам: (

1 Ответ

2 голосов
/ 02 сентября 2009

Отладчик сможет показывать вам только участников, а не свойства. Помните, что в Objective C. они различны. Свойство - это просто синтаксический сахар для сеттера и / или геттера. Таким образом, свойство UIView, доступное только для чтения, в UIView гарантирует только реализацию этого метода:

- (NSArray *)subviews;

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

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

...