Подкласс связанного типа в моно касании

У меня проблема, когда я подклассифицирую тип, который связывает тип obj-C. В некоторых случаях он выходит из строя во время строительства.

Я могу воспроизвести это прямо сейчас с привязками cocos2d и CCSprite. Вот мой подкласс

public class MySprite : CCSprite
{
    public MySprite (string filename) : base (filename)
    {}
}

Когда я его создаю, он терпит неудачу:

Stacktrace:

  at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging.void_objc_msgSendSuper_IntPtr (intptr,intptr,intptr) <IL 0x00025, 0xffffffff>
  at MonoTouch.Cocos2D.CCSprite.set_Texture (MonoTouch.Cocos2D.CCTexture2D) <IL 0x00048, 0x00137>
  at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___object (object,intptr,intptr,intptr) <IL 0x00052, 0xffffffff>
  at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper_IntPtr (intptr,intptr,intptr) <IL 0x00027, 0xffffffff>
  at MonoTouch.Cocos2D.CCSprite..ctor (string) <IL 0x00072, 0x001a3>
  at Demo.MySprite..ctor (string) <IL 0x00002, 0x00027>
 [...]

Native stacktrace:

    0   Demo                       0x00115b5c mono_handle_native_sigsegv + 284
1   Demo                       0x00089c38 mono_sigsegv_signal_handler + 248
2   libsystem_c.dylib                   0x962af86b _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   Demo                       0x0003b9d2 -[CCSprite setOpacityModifyRGB:] + 47
5   Demo                       0x0003c18c -[CCSprite updateBlendFunc] + 267
6   Demo                       0x0003c37c -[CCSprite setTexture:] + 488
7   ???                                 0x11cadc94 0x0 + 298507412
8   ???                                 0x11cada78 0x0 + 298506872
9   ???                                 0x11cadbf6 0x0 + 298507254
10  Demo                       0x0008dff2 mono_jit_runtime_invoke + 722
11  Demo                       0x001f0b7e mono_runtime_invoke + 126
12  Demo                       0x00293736 monotouch_trampoline + 3686
13  Demo                       0x0003909e -[CCSprite initWithTexture:rect:rotated:] + 614
14  Demo                       0x0003914d -[CCSprite initWithTexture:rect:] + 70
15  Demo                       0x0003934c -[CCSprite initWithFile:] + 275
16  ???                                 0x11cad803 0x0 + 298506243
17  ???                                 0x11cad6ec 0x0 + 298505964
18  ???                                 0x11cace30 0x0 + 298503728
19  ???                                 0x11cac958 0x0 + 298502488
20  ???                                 0x11ca7f04 0x0 + 298483460
21  ???                                 0x0d7f7258 0x0 + 226456152
22  ???                                 0x0d7f0a7c 0x0 + 226429564
23  ???                                 0x0d7f0dc5 0x0 + 226430405
24  Demo                       0x0008dff2 mono_jit_runtime_invoke + 722
25  Demo                       0x001f0b7e mono_runtime_invoke + 126
26  Demo                       0x00293736 monotouch_trampoline + 3686
27  UIKit                      0x016c59d6 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1292
28  UIKit                      0x016c68a6 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 508
29  UIKit                      0x016d5743 -[UIApplication handleEvent:withNewEvent:] + 1027
30  UIKit                      0x016d61f8 -[UIApplication sendEvent:] + 68
31  UIKit                      0x016c9aa9 _UIApplicationHandleEvent + 8196
32  GraphicsServices           0x042bafa9 PurpleEventCallback + 1274
33  CoreFoundation             0x037231c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
34  CoreFoundation             0x03688022 __CFRunLoopDoSource1 + 146
35  CoreFoundation             0x0368690a __CFRunLoopRun + 2218
36  CoreFoundation             0x03685db4 CFRunLoopRunSpecific + 212
37  CoreFoundation             0x03685ccb CFRunLoopRunInMode + 123
38  UIKit                      0x016c62a7 -[UIApplication _run] + 576
39  UIKit                      0x016c7a9b UIApplicationMain + 1175
40  ???                        0x0d7ebbc5 0x0 + 226409413
41  ???                        0x0d7e5020 0x0 + 226381856
42  ???                        0x0d7e4390 0x0 + 226378640
43  ???                        0x0d7e44e6 0x0 + 226378982
44  Demo                       0x0008dff2 mono_jit_runtime_invoke + 722
45  Demo                       0x001f0b7e mono_runtime_invoke + 126
46  Demo                       0x001f4d74 mono_runtime_exec_main + 420
47  Demo                       0x001fa165 mono_runtime_run_main + 725
48  Demo                       0x000eb4d5 mono_jit_exec + 149
49  Demo                       0x002889f5 main + 2005
50  Demo                       0x00086f81 start + 53

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

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

Я также попытался [зарегистрировать] класс и добавить переопределения конструктора по умолчанию.

[ОБНОВЛЕНИЕ] Я сравнил этот проект с другим, который работал. Фактически, оба работают на устройстве, и оба одинаково не работают в симуляторе.

[UPDATE2] вот пример, вызывающий такое поведение: https://github.com/StephaneDelcroix/mt-subclassbug Cocos2D.dll — новый, сгенерированный сегодня утром из monotouch-bindings master.


person Stephane Delcroix    schedule 19.02.2013    source источник
comment
Это правильный код? public MySprite (string filename) : base () потому что ваша трассировка стека указывает на: at MonoTouch.Cocos2D.CCSprite..ctor (строка) ‹IL 0x00072, 0x001a3› на Demo.MySprite..ctor (строка) ‹IL 0x00002, 0x00027›, которые соответствуют селектору в собственном стеке след тоже: -[CCSprite initWithFile:]   -  person poupou    schedule 19.02.2013
comment
нет, это неправильный код, ctor вызывает базовый ctor с именем файла, исправляем сейчас   -  person Stephane Delcroix    schedule 19.02.2013
comment
фиксированный. цепочка конструкторов теперь как надо   -  person Stephane Delcroix    schedule 19.02.2013
comment
Цепочка конструкторов (ObjC) и то, что они делают, несколько странная. Можете ли вы подготовить пример приложения, на которое я могу взглянуть?   -  person Rolf Bjarne Kvinge    schedule 20.02.2013
comment
Привет, Рольф. Я сделаю это. Обратите внимание, что привязки могут быть неправильными, а пользовательский код — правильным.   -  person Stephane Delcroix    schedule 20.02.2013
comment
Мне нужно будет протестировать его с более старой (не 3.0) средой выполнения, но я получаю тот же сбой только при использовании симулятора iOS ‹ 6.0 (в противном случае приложение завершает работу). Может быть, есть несоответствие между версиями вашего симулятора и устройств?   -  person poupou    schedule 20.02.2013
comment
У меня так со всеми симуляторами. И приложение не должно закрываться, оно должно показывать мое грустное лицо.   -  person Stephane Delcroix    schedule 20.02.2013
comment
Только что протестировано с последней версией xamarin. все такой же   -  person Stephane Delcroix    schedule 20.02.2013
comment
Похоже, что привязки для -[CCSprite color] нарушены -- он пытается вызвать Messaging.CCColor3B_objc_msgSend_stret (out result, base.get_Handle(), CCSprite.selColor); когда используемая структура слишком мала. Но сломается только на i386 (симулятор)   -  person escrafford    schedule 21.02.2013
comment
Немного повозившись с привязками, я смог заставить Color больше не падать, но вместо того, чтобы работать, он просто показывает черный экран. Раньше я никогда не делал много моноблочного переплета, поэтому я не уверен, насколько я прав в отношении того, куда идти. В погоне за этим я подумал - я понятия не имею, как отлаживать c# и objc одновременно. Есть ли способ использовать lldb с С#? или другое решение??   -  person escrafford    schedule 21.02.2013
comment
@poupou, я должен открыть отчет об ошибке для этого?   -  person Stephane Delcroix    schedule 22.02.2013


Ответы (1)


Отвечая на мой собственный вопрос. Ошибка была не в определении привязок и не в инструментах, используемых для их создания, а в версии 2.1rc0 cocos2d. обновление до 2.1rc0a исправило это.

Затем это вызывает новую проблему, но ее можно проследить до определения привязок, и она исправлена ​​здесь https://github.com/mono/monotouch-bindings/pull/97

person Stephane Delcroix    schedule 27.02.2013