gpt4 book ai didi

iphone - 防止 UIDocumentInteractionController PresentPreview 使我的应用程序崩溃

转载 作者:行者123 更新时间:2023-12-03 21:19:40 26 4
gpt4 key购买 nike

我正在尝试使用 UIDocumentInteractionController 预览文件。看起来很简单,但应用程序随机崩溃并出现 SIGSEGV,并且在尝试了各种黑客方法几个小时后,我只是不明白缺少了什么。

此代码是从我的 UIViewController 类调用的:

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

mInteractionControllerDelegate 和 mInteractionController 是我的 View Controller 类的成员变量(我尝试过这样做,以确保事件不会在本来会被 GC 处理的变量上触发)

我通过单击按钮呈现预览(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 文件:但我不确定文件大小 => 崩溃相关性)。但是,如果我尝试使用一些更大的 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 行,则不会崩溃。

有什么指示、解决方案吗?

最佳答案

有一个 ABI bug当方法返回结构(而不​​是类)(如 RectangleF)时,它会影响 MonoTouch 并导致类似的崩溃。设备版本(使用不同的 ABO)不受此问题的影响。

解决方法是避免重写返回结构的方法,例如:

public override RectangleF RectangleForPreview (UIDocumentInteractionController controller)

关于iphone - 防止 UIDocumentInteractionController PresentPreview 使我的应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6017910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com