2011-05-16 56 views
2

我试图用UidocumentInteractionController预览文件。似乎很简单,但随机的应用程序与SIGSEGV崩溃,几个小时后尝试所有类型的黑客,我只是没有得到什么失踪。防止UIDocumentInteractionController PresentPreview崩溃我的应用程序

此代码是从我的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); 
     });; 
    } 
} 

在某些情况下,预览会起作用(例如小txt文件:但我不确定文件大小=>崩溃相关性)。但是,如果我试图用例如(500 KO)一些较大的PNG文件,我看到预览几秒钟,然后再应用程序崩溃与下面的堆栈跟踪:

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行,不会崩溃。

任何指针,解决方案?

+0

你有没有解决这个问题?谢谢 Marco – 2011-08-04 11:19:38

+0

对不起马可,问题暂时还没解决。因为我已被分配到其他项目,因此该项目暂时搁置。如果项目再次启动,我将不得不解决它。也许monotouch更新会做?您是否尝试过Monotouch或Xamarin支持?如果您有解决方案,请在此发布:) – 2011-08-04 14:57:17

+0

请填写一个缺陷报告,其中包含一个自包含的测试用例。 – poupou 2011-08-09 01:52:38

回答

1

有一个ABI bug影响MonoTouch的方法时,返回结构(而不​​是类),如的RectangleF并导致再次发生类似事故。设备构建(使用不同的ABO)不受此问题影响。

一种解决方法是避免返回结构,如重载方法:

public override RectangleF RectangleForPreview (UIDocumentInteractionController controller) 
+0

对不起,我还没有接受你的解决方案。我无法马上测试(一天没有足够的时间!),但我会尽快检查! – 2011-10-04 07:25:17

+0

不用担心,重要的是人们可以看到一个答案(即使不被接受)比没有:-) OTOH一个确认,如果可以的话,也会有帮助 – poupou 2011-10-04 11:54:00

+0

有足够的时间来测试你的答案,并做了这个诀窍!感谢您的帮助,很高兴知道Xamarin的黑客活跃于SO。 – 2011-12-01 09:14:46