0

在论坛上几个小时后,我仍然无法弄清楚这一点。

场景:我有一个带有可扩展列表的表格视图。当用户想要展开列表时,单击标题,表格会刷新新的计数值。表头视图是:

[MonoTouch.Foundation.Export("tableView:viewForHeaderInSection:")]
public override  UIView GetViewForHeader (UITableView tableView, int section)
{
    float headerHeight= ...;
    UIView headerView = new UIView (new RectangleF ...);

    UIButton button1=new UIButton(new RectangleF (...));

    //set label for button
    UILabel labelTextButton = new UILabel(new RectangleF ...);
    labelTextButton.Text=...;
    labelTextButton.Lines=2;

    button1.AddSubview(labelTextButton);

    button1.TouchUpInside+= (sender, e) =>{

        ...
        tableView.ReloadData();
    };

    headerView.AddSubview (button1);

    return headerView;
}
  • 在模拟器上运行时,它总是在第一次运行时给我这样的错误:
       堆栈跟踪:
     在(包装器托管到本机)MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr)
  在 MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x0004c] 在 /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
       在 XXX.Mobile.IOS.Application.Main (string[]) [0x00000] 在 ..../Main.cs:17
       在(包装器运行时调用).runtime_invoke_void_object(对象,intptr,intptr,intptr)
    本机堆栈跟踪:
    0 XXXXXXXXX 0x000a4d6c mono_handle_native_sigsegv + 284
    1 XXXXXXXXX 0x00018668 mono_sigsegv_signal_handler + 248
    2 libsystem_c.dylib 0x96a028cb _sigtramp + 43
    3 ???0xffffffff 0x0 + 4294967295
    4 UIKit 0x018bf258-[UIApplication 发送操作:toTarget:fromSender:forEvent:] + 61
    5 UIKit 0x01980021-[UIControl sendAction:to:forEvent:] + 66
    6 UIKit 0x0198057f-[UIControl(内部)_sendActionsForEvents:withEvent:] + 578
    7 UIKit 0x0197f6e8-[UIControl touchesEnded:withEvent:] + 546
    8 UIKit 0x01b831d3 _UIGestureRecognizerUpdate + 7407
    9 核心基础 0x03ee2afe __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
    10 核心基础 0x03ee2a3d __CFRunLoopDoObservers + 381
    11 核心基础 0x03ec07c2 __CFRunLoopRun + 1106
    12 核心基础 0x03ebff44 CFRunLoopRunSpecific + 276
    13 核心基础 0x03ebfe1b CFRunLoopRunInMode + 123
    14 图形服务 0x04e8a7e3 GSEventRunModal + 88
    15 图形服务 0x04e8a668 GSEventRun + 104
    16 UIKit 0x018bbffc UIApplicationMain + 1211
    17 ???0x0eeb24ed 0x0 + 250291437
    18 ???0x0ec26f40 0x0 + 247623488
    19 ???0x0ec26b48 0x0 + 247622472
    20 ???0x0ec26c9e 0x0 + 247622814
    21 XXXXXXXXX 0x0001ca32 mono_jit_runtime_invoke + 722
    22 XXXXXXXXX 0x00180b0e mono_runtime_invoke + 126
    23 XXXXXXXXX 0x00184d04 mono_runtime_exec_main + 420
    24 XXXXXXXXX 0x0018a0f5 mono_runtime_run_main + 725
    25 XXXXXXXXX 0x0007a0c5 mono_jit_exec + 149
    26 XXXXXXXXX 0x00218ac4 主 + 1988
    27 XXXXXXXXX 0x000159cd 开始 + 53
    ==================================================== ================
    执行本机代码时获得 SIGSEGV。这通常表明
    单声道运行时或本机库之一中的致命错误
    由您的应用程序使用。
    ==================================================== ================

应用程序退出模拟器主页。如果我从模拟器界面(而不是 MonoTouch)再次启动应用程序,它每次都能完美运行。

  • 将应用程序加载到设备时:

它在第一次运行时运行良好,但有时(每天 3 次)应用程序会以与模拟器相同的方式挂起,但出现不同的错误。

         2013-04-10 16:03:16.838 XXXXXXXXX[2480:907]-[CALayer BridgeSelector]:无法识别的选择器发送到实例 0x2101da0
         2013-04-10 16:03:24.294 XXXXXXXXX[2480:907] 未处理的托管异常:引发了 Objective-C 异常。名称:NSInvalidArgumentException 原因:-[CALayer BridgeSelector]:无法识别的选择器发送到实例 0x2101da0 (MonoTouch.Foundation.MonoTouchException)
          在 MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] 在 /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
      在 XXX.Mobile.IOS.Application.Main (System.String[] args) [0x00000] 在 ...../Main.cs:17
        堆栈跟踪:
        本机堆栈跟踪:
        0 XXXXXXXXX 0x007ff711 mono_handle_native_sigsegv + 244
        1 XXXXXXXXX 0x0083b8cd sigabrt_signal_handler + 112
        2 libsystem_c.dylib 0x3a847e93 _sigtramp + 42
        3 libsystem_c.dylib 0x3a83e123 pthread_kill + 58
        4 libsystem_c.dylib 0x3a87a973 中止 + 94
        5 XXXXXXXXX 0x0089a230 monotouch_throw_monotouch_exception + 0
        6 XXXXXXXXX 0x007fd0e9 mono_invoke_unhandled_exception_hook + 92
        7 XXXXXXXXX 0x007b55e3 mono_thread_abort + 46
        8 XXXXXXXXX 0x007ff3e7 mono_handle_exception_internal + 2138
        9 XXXXXXXXX 0x007ff4b5 mono_handle_exception + 12
        10 XXXXXXXXX 0x0083ab31 mono_arm_throw_exception + 132
        11 XXXXXXXXX 0x003ba468 throw_exception + 68
        12 XXXXXXXXX 0x0089a27c monotouch_exception_handler + 0
        13 XXXXXXXXX 0x0089a32c objc_skip_type + 0
        14 核心基础 0x3252557f + 614
        15 libobjc.A.dylib 0x3a3c9a65 + 128
        16 libc++abi.dylib 0x39e1607b + 78
        17 libc++abi.dylib 0x39e16114 + 19
        18 libc++abi.dylib 0x39e17599 cxa_current_exception_type + 0
        19 libobjc.A.dylib 0x3a3c99d1 objc_exception_rethrow + 12
        20 核心基础 0x3246bf21 CFRunLoopRunSpecific + 456
        21 核心基础 0x3246bd49 CFRunLoopRunInMode + 104
        22 图形服务 0x360202eb GSEventRunModal + 74
        23 UIKit 0x34381301 UIApplicationMain + 1120
        24 XXXXXXXXX 0x0013950c wrapper_managed_to_native_MonoTouch_UIKit_UIApplication_UIApplicationMain_int_string _intptr_intptr + 240
        25 XXXXXXXXX 0x00674f70 XXX_Mobile_IOS_Application_Main_string__ + 152
        26 XXXXXXXXX 0x00384db0 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200
        27 XXXXXXXXX 0x007b7b7f mono_jit_runtime_invoke + 1054
        28 XXXXXXXXX 0x008315ab mono_runtime_invoke + 90
        29 XXXXXXXXX 0x00834457 mono_runtime_exec_main + 306
        30 XXXXXXXXX 0x008346ab mono_runtime_run_main + 482
        31 XXXXXXXXX 0x007d35db mono_jit_exec + 94
        32 XXXXXXXXX 0x00888584 主 + 2220
        33 XXXXXXXXX 0x000143e4 开始 + 40
    ==================================================== ================
    执行本机代码时收到 SIGABRT。这通常表明
    单声道运行时或本机库之一中的致命错误
    由您的应用程序使用。
    ==================================================== ================
    

我不知道这是否是 Monotouch 上 GC 的错误,或者我做错了什么。我在某处读到发送到实例的无效选择器已解决。我试图在按钮事件处理程序中放置断点,但它从未到达那个点。

论坛的其他帖子建议将变量作为全局变量(不是一个好的编程习惯),但这也不起作用。

我的配置:

    Xamarin 工作室
    版本 4.0.3(构建 13)
    运行:
        单声道 2.10.12 (mono-2-10/c9b270d)
        GTK 2.24.16
        GTK# (2.12.0.0)
        包版本:210120000
    苹果开发者工具
    Xcode 4.6.1 (2067)
    构建 4H512
    Xamarin.Mac
    Xamarin.Mac:未安装
    Xamarin.iOS
    版本:6.2.2.8(商业版)
    构建日期:2013-02-04 17:10:37-0400
    构建信息
    发行编号:400030013
    Git 修订:fae7c2bde0e8d51943fbd6afa22d7d2bb7a1192f
    构建日期:2013-03-21 19:16:39+0000
    Xamarin 插件:906a1edff23bcfd0ab7518463620a8ee506eaea2
    操作系统
    Mac OS X 10.8.3
    
感谢您的时间

奥维迪乌

4

2 回答 2

0

对于任何有同样问题的人:

我观察到,对于较新版本的 Xamarin.IOS,GC 更具侵略性。

我用上面的代码尝试了一切,但没有任何效果。

我认为 GC 不保留在 Table 委托方法中声明的变量。GC 过早地采取了任何声明在那里的按钮。表格单元格的出列可能有问题。

无论如何,我从项目选项中禁用了 SGEN 构建选项。据说那里是实验性的。

这解决了我的问题,我不知道这是否是最好的解决方案,但我没有任何想法。无法调试这些内存/分配问题令人沮丧。

我已经用 Instruments 检查了禁用 SGen 的内存分配,并且内存没有像以前那样被释放。

我没有将此标记为已解决,因为我的解决方案是一种解决方法。SGen 不应该这样工作。

此致,

奥维迪乌

于 2013-04-23T10:10:27.620 回答
0

我也遇到了这个问题,Ovidiu 为我节省了几个小时的调试时间;这对我来说也是一个 GC 问题。万一其他人遇到这个问题 - 我通过在类而不是函数中定义 UIBUtton 来避免 GC。

于 2013-04-24T19:45:19.470 回答