Связывание нативной библиотеки в MonoTouch: работает, но почему странные результаты при создании подклассов? Отсутствует атрибут NullAllowed?

Монотач 5.2.13

Я использую родную библиотеку ObjectiveC через привязки MonoTouch. Библиотека предоставляет контроллер представления. Все работает нормально, пока я не подклассифицирую контроллер представления. Затем я получаю ссылочные исключения NULL или часть пользовательского интерфейса не отображается.

Я читал о проблемах с инструментом btouch и опцией "-e". Но из того, что я вижу, варианта нет:

Выполнение инструмента /Developer/MonoTouch/usr/bin/btouch началось с аргументами: /d:DEBUG ApiDefinition.cs /s:StructsAndEnums.cs /tmpdir:obj/Debug/ios/ /sourceonly:obj/Debug/ios//sources. список

Подкласс (в этом примере) не добавляет никакой функциональности, но его использования достаточно, чтобы разорвать привязку:

// Works.
var contr = new NativeController();

// Fails with various errors. Throws a NULL reference exception about some UIPopoverController being NULL, for instance.
public class SubclassedController : NativeController
{
  public SubclassedController() : base()
  {
  }
}

var contr = new SubclassedController();

Я понял, что добавление [NullAllowed] к свойству решило исключение ссылки NULL.

Собственный контроллер предоставляет свойство (nonatomic, strong) UIPopoverController *popoverController. Это было связано как UIPopoverController PopoveController {get; set;} - добавление NullAllowed здесь решило проблему.

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

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

Это приводит к трем вопросам:

  • Почему поведение отличается при использовании подклассов? Что делает MonoTouch, чтобы это произошло? Почему я получаю NULL ref в случае использования производного класса? Я не касаюсь UIPopoverController в любом случае.
  • Как я могу узнать, что не так и как это исправить, если ошибки нет?
  • О чем еще нужно позаботиться, кроме NullAllowed?

person Krumelur    schedule 28.08.2012    source источник


Ответы (2)


Почему поведение отличается при использовании подклассов?

Может быть несколько причин, включая инициализацию экземпляра по-разному в зависимости от имени класса. Это несложно сделать на C# (очень редко, используется наследование) или Objective-C (для настройки поведения часто используются делегаты).

Вам потребуется обратиться к документации, файлы заголовков, samples и поддержку вашей собственной библиотеки, чтобы понять, как работает создание подклассов.

Что делает MonoTouch, чтобы это произошло?

Я не думаю, что это связано с MonoTouch. MonoTouch предоставляет btouch для помощи в создании привязок для библиотек Objective-C. Это тот же инструмент, который Xamarin использует для создания всех привязок iOS.

Все еще не уверены? напишите небольшой пример Objective-C, который делает то же самое. Сравните результаты с версией MonoTouch.

Разные результаты? Заполните отчет об ошибке с тестовым примером (C# и ObjC), и мы проверим, что происходит (как указано ранее у нас есть веские причины убедиться, что btouch не содержит ошибок ;-)

Почему я получаю NULL ref в случае использования производного класса? Я не касаюсь UIPopoverController в любом случае.

Как я могу узнать, что не так и как это исправить, если ошибки нет?

О чем еще нужно позаботиться, кроме NullAllowed?

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

  • чтение документации библиотеки;
  • чтение исходного кода библиотеки (при его наличии), заголовков и примеров;
  • для [NullAllowed] вы можете проверить (например, модульные тесты), разрешено ли null или нет (например, произойдет ли сбой);

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

person poupou    schedule 28.08.2012
comment
Привет, Себастьян, и спасибо за ваш ответ, я новичок в модульном тесте, не могли бы вы уточнить или указать мне, как это реализовать ?? - person dalexsoto; 28.08.2012
comment
Итак, вы говорите, что NULL ref — это другая проблема, чем неожиданное поведение, например отсутствующие изображения. Последнее кажется невозможным без поддержки или исходного кода. Если честно: я еще не пробовал, работает ли подкласс в версии ObjC. - person Krumelur; 28.08.2012
comment
Это может быть та же логическая причина, то есть особые требования к подклассу. Хотя я сомневаюсь, что это одна и та же физическая (кодовая) причина, возможно, что одно и то же решение (например, правильный подкласс) решит обе проблемы. - person poupou; 28.08.2012
comment
@poupou Я только что выяснил, что проблема возникает только в MT 5.2.13, но не в 5.3.6 ... Я расследую и отправлю сообщение об ошибке или свяжусь с вами по электронной почте. - person Krumelur; 29.08.2012

Эта конкретная проблема оказалась двумя вещами:

  • Отсутствует атрибут NullAllowed для UIPopoverController
  • Ошибка в MonoTouch 5.2.13, не связанная с привязкой, а связанная с CocoaTouch. Конкретная причина неизвестна.

Все работает как положено с MonoTouch 5.3.6

person Krumelur    schedule 29.08.2012