绑定的Xamarin.iOS库子类在模拟器上崩溃

时间:2014-02-06 09:00:07

标签: c# ios xamarin.ios xamarin

我目前遇到了iOS模拟器的问题。

我目前正在开发一个带有绑定Objective-C库(ECSlidingViewController)的Xamarin项目。我为armv7,armv7s,simulator和arm64架构构建了库,将它们组合成一个胖二进制文件并使用Xamarin绑定项目绑定它。

现在绑定在大多数情况下工作正常,除了一个小花絮。每当我子类化绑定库中包含的ECSlidingViewController类并尝试在我的应用程序中使用子类时,应用程序在我尝试调用AnchorTopViewToRightAnimated(bool animated)时终止。所有其他属性和方法都可以正常工作。

方法绑定如下:

[BaseType (typeof (UIViewController))]
interface ECSlidingViewController {
            //...

            [Export ("anchorTopViewToRightAnimated:")]
        void AnchorTopViewToRightAnimated (bool animated);
}

这只发生在模拟器上,并且仅在访问子类上的方法时(即使该子类被转换为它的父类型)。在非子类ECSlidingViewController实例上调用或在设备上运行时,它可以正常工作。应用程序终止后,调试输出不包含任何相关错误。我能找到的唯一信息是OS X控制台中的崩溃日志:

Process:         TTWebApp [851]
Path:            /Users/USER/Library/Application Support/iPhone Simulator/*/TTWebApp.app/TTWebApp
Identifier:      TTWebApp
Version:         0
Code Type:       X86 (Native)
Parent Process:  launchd_sim [819]
User ID:         501

Date/Time:       2014-02-06 09:35:01.372 +0100
OS Version:      Mac OS X 10.8.5 (12F37)
Report Version:  10

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000

Application Specific Information:
iPhone Simulator 463.9.4.2, iPhone OS 7.0.3 (iPad/11B508)


Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   CoreFoundation                  0x04f3fb71 CFRetain + 113
1   ???                             0x123b5e18 0 + 305880600
2   ???                             0x123b5b28 0 + 305879848
3   ???                             0x123b5d76 0 + 305880438
4   TTWebApp                        0x00167484 mono_jit_runtime_invoke + 820 (mini.c:6622)
5   TTWebApp                        0x0020207f mono_runtime_invoke + 127 (object.c:2827)
6   TTWebApp                        0x002a554a get_delegate_for_block_parameter + 138 (monotouch-glue.m:292)
7   TTWebApp                        0x002ac8f7 monotouch_trampoline + 1847 (.monotouch-trampoline-setup-callstack.inc:70)
8   TTWebApp                        0x0007d3f7 -[ECSlidingViewController anchorTopViewToRightAnimated:] + 49 (ECSlidingViewController.m:412)
9   ???                             0x120f6688 0 + 302999176
10  ???                             0x120f7fc4 0 + 303005636
11  ???                             0x120f7daf 0 + 303005103
12  ???                             0x120f7d38 0 + 303004984
13  ???                             0x0fee1cef 0 + 267263215
14  TTWebApp                        0x00167484 mono_jit_runtime_invoke + 820 (mini.c:6622)
15  TTWebApp                        0x0020207f mono_runtime_invoke + 127 (object.c:2827)
16  TTWebApp                        0x002ad21a monotouch_trampoline + 4186 (.monotouch-trampoline-invoke.inc:1)
17  libobjc.A.dylib                 0x04d8f874 -[NSObject performSelector:withObject:withObject:] + 77
18  UIKit                           0x032eb0c2 -[UIApplication sendAction:to:from:forEvent:] + 108
19  UIKit                           0x035bfc9b -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 139
20  libobjc.A.dylib                 0x04d8f874 -[NSObject performSelector:withObject:withObject:] + 77
21  UIKit                           0x032eb0c2 -[UIApplication sendAction:to:from:forEvent:] + 108
22  UIKit                           0x032eb04e -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
23  UIKit                           0x033e30c1 -[UIControl sendAction:to:forEvent:] + 66
24  UIKit                           0x033e3484 -[UIControl _sendActionsForEvents:withEvent:] + 577
25  UIKit                           0x033e2733 -[UIControl touchesEnded:withEvent:] + 641
26  UIKit                           0x0332851d -[UIWindow _sendTouchesForEvent:] + 852
27  UIKit                           0x03329184 -[UIWindow sendEvent:] + 1232
28  UIKit                           0x032fce86 -[UIApplication sendEvent:] + 242
29  UIKit                           0x032e718f _UIApplicationHandleEventQueue + 11421
30  CoreFoundation                  0x04f4d83f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
31  CoreFoundation                  0x04f4d1cb __CFRunLoopDoSources0 + 235
32  CoreFoundation                  0x04f6a29e __CFRunLoopRun + 910
33  CoreFoundation                  0x04f69ac3 CFRunLoopRunSpecific + 467
34  CoreFoundation                  0x04f698db CFRunLoopRunInMode + 123
35  GraphicsServices                0x0654f9e2 GSEventRunModal + 192
36  GraphicsServices                0x0654f809 GSEventRun + 104
37  UIKit                           0x032e9d3b UIApplicationMain + 1225
38  ???                             0x10eefb00 0 + 284097280
39  ???                             0x10eedc1c 0 + 284089372
40  ???                             0x10eed7f8 0 + 284088312
41  ???                             0x10eed937 0 + 284088631
42  TTWebApp                        0x00167484 mono_jit_runtime_invoke + 820 (mini.c:6622)
43  TTWebApp                        0x0020207f mono_runtime_invoke + 127 (object.c:2827)
44  TTWebApp                        0x002078c7 mono_runtime_exec_main + 391 (object.c:4050)
45  TTWebApp                        0x00207694 mono_runtime_run_main + 628 (object.c:3678)
46  TTWebApp                        0x000d135d mono_jit_exec + 93 (driver.g.c:1009)
47  TTWebApp                        0x0029f7e4 main + 2788 (main.m:489)
48  libdyld.dylib                   0x05a7c725 start + 1

Thread 1:: Dispatch queue: com.apple.libdispatch-manager
0   libsystem_kernel.dylib          0x05c4c9ca kevent64 + 10
1   libdispatch.dylib               0x057c6f3e _dispatch_mgr_invoke + 238
2   libdispatch.dylib               0x057c6c7a _dispatch_mgr_thread + 60

Thread 2:
0   libsystem_kernel.dylib          0x05c4c0ee __workq_kernreturn + 10
1   libsystem_c.dylib               0x05b090ac _pthread_workq_return + 45
2   libsystem_c.dylib               0x05b08e79 _pthread_wqthread + 448
3   libsystem_c.dylib               0x05af0daa start_wqthread + 30

Thread 3:
0   libsystem_kernel.dylib          0x05c4bb3e __recvfrom + 10
1   libsystem_sim_c.dylib           0x0589ca9d recv + 54
2   TTWebApp                        0x002a19dd recv_uninterrupted + 77 (debug.m:321)
3   TTWebApp                        0x002a1c0b monotouch_process_connection + 187 (debug.m:738)
4   TTWebApp                        0x002a17e7 monotouch_connect_wifi + 2983 (debug.m:515)
5   TTWebApp                        0x002a08ac monotouch_configure_debugging + 2124 (debug.m:269)
6   TTWebApp                        0x0029e2ea -[CocoaThreadInitializer entryPoint:] + 122 (shared.m:127)
7   Foundation                      0x01aaf597 -[NSThread main] + 76
8   Foundation                      0x01aaf4f6 __NSThread__main__ + 1275
9   libsystem_c.dylib               0x05b065b7 _pthread_start + 344
10  libsystem_c.dylib               0x05af0dce thread_start + 34

Thread 4:
0   libsystem_kernel.dylib          0x05c4980a semaphore_wait_trap + 10
1   TTWebApp                        0x0027967a mono_sem_wait + 26 (mono-semaphore.c:121)
2   TTWebApp                        0x001aa2d7 finalizer_thread + 103 (gc.c:1078)
3   TTWebApp                        0x00239ab8 start_wrapper + 376 (threads.c:609)
4   TTWebApp                        0x0026dcd7 thread_start_routine + 151 (wthreads.c:294)
5   TTWebApp                        0x00279d31 inner_start_thread + 65 (mono-threads-posix.c:49)
6   TTWebApp                        0x0029b51d GC_start_routine + 93 (pthread_support.c:1502)
7   libsystem_c.dylib               0x05b065b7 _pthread_start + 344
8   libsystem_c.dylib               0x05af0dce thread_start + 34

Thread 5:
0   libsystem_kernel.dylib          0x05c4bb3e __recvfrom + 10
1   libsystem_sim_c.dylib           0x0589ca9d recv + 54
2   TTWebApp                        0x002a19dd recv_uninterrupted + 77 (debug.m:321)
3   TTWebApp                        0x002a1ad4 sdb_recv + 52 (debug.m:337)
4   TTWebApp                        0x000bc0fb debugger_thread + 22427 (debugger-agent.c:1475)
5   TTWebApp                        0x0026dcd7 thread_start_routine + 151 (wthreads.c:294)
6   TTWebApp                        0x00279d31 inner_start_thread + 65 (mono-threads-posix.c:49)
7   TTWebApp                        0x0029b51d GC_start_routine + 93 (pthread_support.c:1502)
8   libsystem_c.dylib               0x05b065b7 _pthread_start + 344
9   libsystem_c.dylib               0x05af0dce thread_start + 34

Thread 6:
0   libsystem_kernel.dylib          0x05c4bc72 __semwait_signal + 10
1   libsystem_sim_c.dylib           0x0589c98b nanosleep + 219
2   libsystem_sim_c.dylib           0x0589c836 usleep + 60
3   TTWebApp                        0x002a62bd monotouch_pump_gc + 61 (monotouch-glue.m:595)
4   libsystem_c.dylib               0x05b065b7 _pthread_start + 344
5   libsystem_c.dylib               0x05af0dce thread_start + 34

Thread 7:
0   libsystem_kernel.dylib          0x05c4c0ee __workq_kernreturn + 10
1   libsystem_c.dylib               0x05b090ac _pthread_workq_return + 45
2   libsystem_c.dylib               0x05b08e79 _pthread_wqthread + 448
3   libsystem_c.dylib               0x05af0daa start_wqthread + 30

Thread 0 crashed with X86 Thread State (32-bit):
  eax: 0x00000000  ebx: 0x00000000  ecx: 0x04f3fb00  edx: 0x00000000
  edi: 0x04f3fb0e  esi: 0x00000000  ebp: 0xbff8ccc8  esp: 0xbff8ccb0
   ss: 0x00000023  efl: 0x00000246  eip: 0x04f3fb71   cs: 0x0000001b
   ds: 0x00000023   es: 0x00000023   fs: 0x00000000   gs: 0x0000000f
  cr2: 0x10165e98
Logical CPU: 0

1 个答案:

答案 0 :(得分:3)

我的猜测是你的绑定包含一个采用C#委托的方法,该委托可以为null。不幸的是,Xamarin.iOS不支持绑定一个可以为null的委托。

您可以尝试一些解决方法:

  • 在方法签名中使用IntPtr而不是委托类型。这将使该方法本身非常无用,因为您将无法使用自己的委托调用它。
  • 完全删除相关方法,其结果与上述相同。
  • Pass --registrar:dynamic作为项目iOS构建选项中的附加mtouch参数。这将解决问题,实际上不会将您的方法暴露给Objective-C,直到子类覆盖它(在这种情况下,您最终会遇到与现在相同的崩溃)。缺点是您必须记录该标志对于您图书馆的所有消费者是必须的。