Предотвратить сбой моего приложения UIDocumentInteractionController PresentPreview - PullRequest
2 голосов
/ 16 мая 2011

Я пытаюсь просмотреть файл с помощью UIDocumentInteractionController. Кажется достаточно простым, но случайным образом приложение вылетает с SIGSEGV, и после нескольких часов попыток всех видов хаков я просто не понимаю, чего не хватает.

Этот код вызывается из моего класса UIViewController:

void Initialize ()
{
    mInteractionControllerDelegate = new  UIDocumentInteractionControllerDelegateClass(this, mFile);
    mInteractionController = UIDocumentInteractionController.FromUrl(NSUrl.FromFilename(mFile.Name));
    mInteractionController.Delegate = mInteractionControllerDelegate;
}

mInteractionControllerDelegate и mInteractionController являются переменными-членами моего класса контроллера представления (я попытался это сделать, чтобы убедиться, что событие не было запущено для переменной, которая была бы GCed)

Я представляю предварительный просмотр одним нажатием кнопки (часть с MPMoviePlayerViewController работает нормально:

void btnShowTouchUpInside (object sender, EventArgs e)
{
    if (mFile.Name.EndsWith(".mpeg") || mFile.Name.EndsWith(".avi") || mFile.Name.EndsWith(".mpg"))
    {
        MPMoviePlayerViewController mp = new MPMoviePlayerViewController(NSUrl.FromString(mFile.VideoURL));
        this.PresentMoviePlayerViewController(mp);
    }
    else
    {
        InvokeOnMainThread(delegate {
            mInteractionController.PresentPreview(true);
        });;
    }
}

В некоторых случаях предварительный просмотр будет работать (например, для небольших текстовых файлов: но я не уверен в размере файла => корреляции сбоев). Но если я попытаюсь, например, с некоторыми большими файлами png (500 ko), я вижу предварительный просмотр в течение нескольких секунд, а затем приложение вылетает со следующей трассировкой стека:

Stacktrace:

at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging.void_objc_msgSend (intptr,intptr) <IL 0x00024, 0xffffffff>
at MonoTouch.Foundation.NSObject/MonoTouch_Disposer.Drain (MonoTouch.Foundation.NSObject) [0x0002a] in /Users/plasma/Source/iphone/monotouch/Foundation/NSObject.cs:305
at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___object (object,intptr,intptr,intptr) <IL 0x00052, 0xffffffff>
at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff>
at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00038] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26
at MonoTouch.UIKit.UIApplication.Main (string[]) [0x00000] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:31
at DTS.Application.Main (string[]) [0x00000] in /Users/seb/Projects/DTS/DTS/Main.cs:14
at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

Native stacktrace:

0   DTS                                 0x000d1965 mono_handle_native_sigsegv + 343
1   DTS                                 0x0000ffb4 mono_sigsegv_signal_handler + 322
2   libSystem.B.dylib                   0x98a9f45b _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   ???                                 0x0d24837c 0x0 + 220496764
5   ???                                 0x077520d6 0x0 + 125116630
6   DTS                                 0x0000fd6f mono_jit_runtime_invoke + 1332
7   DTS                                 0x001ee239 mono_runtime_invoke + 137
8   DTS                                 0x0029e9ab monotouch_trampoline + 2527
9   Foundation                          0x0140e94e __NSThreadPerformPerform + 251
10  CoreFoundation                      0x00ea08ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
11  CoreFoundation                      0x00dfe88b __CFRunLoopDoSources0 + 571
12  CoreFoundation                      0x00dfdd86 __CFRunLoopRun + 470
13  CoreFoundation                      0x00dfd840 CFRunLoopRunSpecific + 208
14  CoreFoundation                      0x00dfd761 CFRunLoopRunInMode + 97
15  GraphicsServices                    0x0404c1c4 GSEventRunModal + 217
16  GraphicsServices                    0x0404c289 GSEventRun + 115
17  UIKit                               0x01ce0c93 UIApplicationMain + 1160
18  ???                                 0x09d540a3 0x0 + 164970659
19  ???                                 0x09d53e74 0x0 + 164970100
20  ???                                 0x09d53474 0x0 + 164967540
21  ???                                 0x09d532cc 0x0 + 164967116
22  ???                                 0x09d5341e 0x0 + 164967454
23  DTS                                 0x0000fd6f mono_jit_runtime_invoke + 1332
24  DTS                                 0x001ee239 mono_runtime_invoke + 137
25  DTS                                 0x001f0920 mono_runtime_exec_main + 669
26  DTS                                 0x001efd0a mono_runtime_run_main + 843
27  DTS                                 0x000a3c62 mono_jit_exec + 200
28  DTS                                 0x002a25eb main + 3838
29  DTS                                 0x000030c9 _start + 208
30  DTS                                 0x00002ff8 start + 40

Debug info from gdb:

/tmp/mono-gdb-commands.VWK7bK:1: Error in sourced command file:
unable to debug self

=================================================================
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.
=================================================================

Окончательная подсказка: это код для UIDocumentInteractionControllerDelegateClass (созданный из других вопросов по SO):

public class UIDocumentInteractionControllerDelegateClass : UIDocumentInteractionControllerDelegate
{
    private UIViewController mViewController;
    private DTSVirtualFile mFile;

    public UIDocumentInteractionControllerDelegateClass(UIViewController viewController, DTSVirtualFile file)
    {
        mViewController = viewController;
        mFile = file;
    }

    public override UIViewController ViewControllerForPreview (UIDocumentInteractionController controller)
    {
        return mViewController;
    }

    public override UIView ViewForPreview (UIDocumentInteractionController controller)
    {
        return mViewController.View;
    }

    public override RectangleF RectangleForPreview (UIDocumentInteractionController controller)
    {
        return mViewController.View.Frame;
    }

    public override void DidEndPreview (UIDocumentInteractionController controller)
    {
        mFile.DeleteCopy();
    }

    public override void DidDismissOptionsMenu (UIDocumentInteractionController controller)
    {
        // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
    }

    public override void WillBeginPreview (UIDocumentInteractionController controller)
    {
        Console.WriteLine("WillBeginPreview");          
    }

    public override void WillBeginSendingToApplication (UIDocumentInteractionController controller)
    {
        // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
    }

    public override void WillPresentOpenInMenu (UIDocumentInteractionController controller)
    {
        // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
    }

    public override void WillPresentOptionsMenu (UIDocumentInteractionController controller)
    {
        // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
    }
}

Когда я отлаживаюсь, я могу нормально перешагнуть PresentPreview, но сразу после этого происходит сбой. Если я прокомментирую строку PresentPreview, никаких сбоев.

Какие-нибудь указатели, решения?

1 Ответ

1 голос
/ 27 сентября 2011

Существует ошибка ABI , которая влияет на MonoTouch, когда методы возвращают структуры (не классы), например RectangleF , и приводит к подобным сбоям. Построения устройств (с использованием другого ABO) не подвержены этой проблеме.

Обходной путь - избежать переопределения методов, которые возвращают структуру, такую ​​как:

public override RectangleF RectangleForPreview (UIDocumentInteractionController controller)
...