2016-01-18 10 views
1

В моем проекте Xamarin Mac я создал программный код NSTableView. У меня есть пользовательский NSTableHeaderCell, который я использую для ячеек заголовка столбца. По какой-то причине на некоторых машинах, это бросает ошибкуПрограммно созданный бросок NSTableView Не удалось маршалировать объект Objective-C (Xamarin)

Failed to marshal the Objective-C object 0x121f77e90 (type: XXXTableHeaderCell). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance (because the type 'XXXTableHeaderCell' does not have a constructor that takes one IntPtr argument). 

Я знаю, это может быть выброшен, если вы загружаете из СИБ/XIb, но я строю все это в коде. Я также знаю, что это может произойти, если ваш управляемый объект получает GC'd, но объекты ячейки заголовка и столбца должны удерживаться в виде таблицы.

Ввод пустого конструктора, который принимает IntPtr, кажется, исправляет проблему, но я обеспокоен тем, что он создает новый объект, когда он должен использовать что-то, что уже существует (или должно быть, по крайней мере, по крайней мере).

Я пропустил что-то в том, как они держатся?

+0

Без какого-либо кода трудно помочь, но да, почти всегда эта ошибка возникает из-за ObjC obj, который живет без его управляемого партнера (который получил GC'd). Я бы удостоверился, что ваш XXXTableHeaderCell имеет ссылку на класс. – SushiHangover

+0

Чтобы это исключить, я добавил объекты класса для каждой ячейки столбца и заголовка в моем подклассе NSTableView. Я все еще пытаюсь понять, кто даже вызывает конструктор IntPtr. Это называется дважды, но у меня четыре столбца. Я бы ожидал, что это будет называться 4x или нет ... но два? К сожалению, я не могу опубликовать сам код. Я бы попытался взломать образец, но это займет больше времени, чем я могу, и это происходит только на некоторых машинах. – Brian

ответ

0

Последняя часть ошибки, вероятно, содержит ключ:

«XXXTableHeaderCell» не имеет конструктор, который принимает один IntPtr аргумент

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

+0

В конце концов я добавил. Но все столбцы и заголовки выделены вручную в моем коде. Крушение было не позже. Я не уверен, что еще пыталось их маршалировать. – Brian

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

  • Нет связанных вопросов^_^