jjzjj

ios - 垃圾收集器期间的 MonoTouch SIGSEGV 在 ABPeoplePickerNavigationController 上启动 Dispose

coder 2024-01-26 原文

针对 MT 6.0.4 构建。 针对 iOS 4。 在 iPhone 4S 上测试。

我对我做错了什么感到难过。我在订阅 SelectPerson 事件后模态显示 ABPeoplePickerNavigationController。在事件中,我获取了所需数据的副本(仅保留对字符串的引用,而不是对任何 AdressBook 或 Person 实例的引用),然后关闭模式对话框:

private string selectedPersonFirstName;
private string selectedPersonEmail;
private string selectedPersonPhone;

private void SelectContact()
{
    var peoplePicker = new ABPeoplePickerNavigationController();
    peoplePicker.Cancelled += (sender, e) => 
    {
        selectedPersonFirstName = null;
        selectedPersonEmail = null;
        selectedPersonPhone = null;
        peoplePicker.DismissViewController(true, null);
    };
    peoplePicker.SelectPerson += (sender, e) => 
    {
        var selectedName = String.Format("{0} {1}", e.Person.FirstName, e.Person.LastName);
        selectedPersonFirstName = e.Person.FirstName;
        if ( e.Person.GetEmails().Count > 0)
            selectedPersonEmail = e.Person.GetEmails().FirstOrDefault().Value;
        if ( e.Person.GetPhones().Count > 0)
            selectedPersonPhone = e.Person.GetPhones().FirstOrDefault().Value;

        peoplePicker.DismissViewController(true, null);
    };

    PresentViewController(peoplePicker, true, null);
}

稍后当 GC 启动时,它崩溃了:

Stacktrace:

  at MonoTouch.Foundation.NSObject.FinishDispose () [0x0000b] in /Developer/MonoTouch/Source/monotouch/src/Foundation/NSObject.cs:158
  at MonoTouch.Foundation.NSObject/MonoTouch_Disposer.Drain (MonoTouch.Foundation.NSObject) [0x00062] in /Developer/MonoTouch/Source/monotouch/src/Foundation/NSObject.cs:376
  at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff>
  at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
  at MyApp.iOS.Application.Main (string[]) [0x00000] in /Users/tyson/Code/MyApp/iOS/Main.cs:19
  at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff>

Native stacktrace:

    0   MyAppName---------------            0x00f574f4 mono_handle_native_sigsegv + 280
    1   MyAppName---------------            0x00f3a2b8 mono_sigsegv_signal_handler + 268
    2   libsystem_c.dylib                   0x31ae97ed _sigtramp + 48
    3   CoreFoundation                      0x3745b2e7 CFRelease + 94
    4   AddressBookUI                       0x373922d1 -[ABGroupWrapper dealloc] + 100
    5   libobjc.A.dylib                     0x35a14175 _objc_rootRelease + 36
    6   AddressBookUI                       0x373a3f57 -[ABModel dealloc] + 146
    7   libobjc.A.dylib                     0x35a14175 _objc_rootRelease + 36
    8   AddressBookUI                       0x373aec43 -[ABAbstractViewController dealloc] + 38
    9   AddressBookUI                       0x373aeb3d -[ABMembersViewController dealloc] + 216
    10  libobjc.A.dylib                     0x35a14175 _objc_rootRelease + 36
    11  CoreFoundation                      0x3745b2e7 CFRelease + 94
    12  CoreFoundation                      0x3747106b -[__NSArrayM dealloc] + 122
    13  libobjc.A.dylib                     0x35a14175 _objc_rootRelease + 36
    14  UIKit                               0x33c891b9 -[UIViewController dealloc] + 496
    15  UIKit                               0x33c88f2f -[UINavigationController dealloc] + 198
    16  AddressBookUI                       0x373adcbd -[ABPeoplePickerNavigationController dealloc] + 376
    17  libobjc.A.dylib                     0x35a14175 _objc_rootRelease + 36
    18  MyAppName---------------            0x001e1ccc wrapper_managed_to_native_MonoTouch_ObjCRuntime_Messaging_void_objc_msgSend_intptr_intptr + 68
    19  MyAppName---------------            0x001ad49c MonoTouch_Foundation_NSObject_MonoTouch_Disposer_Drain_MonoTouch_Foundation_NSObject + 364
    20  MyAppName---------------            0x006997b8 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200
    21  MyAppName---------------            0x00f3c6a4 mono_jit_runtime_invoke + 1644
    22  MyAppName---------------            0x00ff5dc0 mono_runtime_invoke + 128
    23  MyAppName---------------            0x00f2c6ec native_to_managed_trampoline_MonoTouch_Foundation_NSObject_MonoTouch_Disposer_Drain + 280
    24  CoreFoundation                      0x374a0eef +[NSObject performSelector:withObject:] + 42
    25  Foundation                          0x37d51747 __NSThreadPerformPerform + 350
    26  CoreFoundation                      0x374e6ad3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
    27  CoreFoundation                      0x374e629f __CFRunLoopDoSources0 + 214
    28  CoreFoundation                      0x374e5045 __CFRunLoopRun + 652
    29  CoreFoundation                      0x374684a5 CFRunLoopRunSpecific + 300
    30  CoreFoundation                      0x3746836d CFRunLoopRunInMode + 104
    31  GraphicsServices                    0x32375439 GSEventRunModal + 136
    32  UIKit                               0x33bece7d UIApplicationMain + 1080
    33  MyAppName---------------            0x001e6ca4 wrapper_managed_to_native_MonoTouch_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr + 240
    34  MyAppName---------------            0x00ee0210 MyApp_iOS_Application_Main_string__ + 152
    35  MyAppName---------------            0x006997b8 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200
    36  MyAppName---------------            0x00f3c6a4 mono_jit_runtime_invoke + 1644
    37  MyAppName---------------            0x00ff5dc0 mono_runtime_invoke + 128
    38  MyAppName---------------            0x00ffa224 mono_runtime_exec_main + 436
    39  MyAppName---------------            0x00fff770 mono_runtime_run_main + 756
    40  MyAppName---------------            0x00f434a4 mono_jit_exec + 140
    41  MyAppName---------------            0x0105c04c main + 2028
    42  MyAppName---------------            0x0001bd18 start + 40

=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

有没有人见过这样的事情?我现在正在寻找解决方法,因为我需要它更可靠地尽快进行演示(还不是应用商店提交)。

最佳答案

它看起来像一个错误。有些东西被释放一次太多而崩溃。

为了您的演示目的,您可以通过像这样定义 CFRetain 来解决它:

[System.Runtime.InteropServices.DllImport ("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
static extern IntPtr CFRetain (IntPtr obj);

然后在 _AddressBook 上使用它,就像那样

peoplePicker.SelectPerson += (sender, e) => {
    CFRetain (peoplePicker._AddressBook);
    var selectedName = String.Format("{0} {1}", e.Person.FirstName, e.Person.LastName);
    ...

这将平衡计数并避免崩溃。

更新:错误已补,你可以抄送。自己的bug report了解何时发布修复程序。

关于ios - 垃圾收集器期间的 MonoTouch SIGSEGV 在 ABPeoplePickerNavigationController 上启动 Dispose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925370/

有关ios - 垃圾收集器期间的 MonoTouch SIGSEGV 在 ABPeoplePickerNavigationController 上启动 Dispose的更多相关文章

  1. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby - 使用 Capistrano 启动 sidekiq - 2

    我想用Capistrano启动sidekiq。下面是代码namespace:sidekiqdotask:startdorun"cd#{current_path}&&bundleexecsidekiq-c10-eproduction-Llog/sidekiq.log&"pcapture("psaux|grepsidekiq|awk'{print$2}'|sed-n1p").strip!endend它执行成功但sidekiq仍然没有在服务器上启动。输出:$capsidekiq:starttriggeringloadcallbacks*2014-06-0315:03:01executing`

  8. ruby-on-rails - fastercsv 的 Rails 3 服务器启动问题 - 2

    我有一个正在升级到Rails3的Rails2.3.5应用程序。我做了所有我需要做的升级以及当我使用启动Rails服务器时要做的事情railsserver它给了我这个PleaseswitchtoRuby1.9'sstandardCSVlibrary.It'sFasterCSVplussupportforRuby1.9'sm17nencodingengine.我正在使用ruby-1.9.2-p0并安装了fastercsv(1.5.3)gem。在puts语句的帮助下,我能够追踪到错误发生的位置。我发现执行在这一行停止了Bundler.require(:default,Rails.env)if

  9. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  10. 如何判断oracle是否启动及启动oracle数据库 - 2

    plsql连接Oracle超时,完犊子了肯定是服务器断电了。得马上检查Oracle服务器状态1、检查数据库是否启动su-oracle切换到Oracle用户,输入sqlplus/assysdba显示连接状态。如果末尾显示的状态是Connectedtoanidleinstance.证明未启动2、启动数据库startup启动数据库,末尾出现Databaseopened说明数据库启动成功3、查看数据库监听是否正常先quit;断开Oracle连接,使用lsnrctlstatus查看监听状态,如果出现TNS-开头的Nolistener、Connectionrefused等错误,说明监听未启动4、启动数据库

随机推荐