【发布时间】:2016-05-31 17:40:14
【问题描述】:
我的一个老问题与在 monotouch 中查看 pdf 文件有关(我设法做到了这一点)。 Port of the iOS pdf viewer for xamarin
我的问题如下:如果我开始关闭并打开一个 pdf 视图(带有 catiledlayer 的视图)真的很快,而且我的应用程序经常崩溃:
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.
在互联网上搜索了几天后,我发现一个帖子说的是:正在清理图像后台存储,这是导致错误的原因。
编辑: 好的,我得出的结论是我的应用程序正在清理内存并且我的指针正在变成空值。我调用了 Gc.Collect() 几次,这似乎是问题的根源。
我已经删除了对 GC.Collect() 的所有调用,并且我目前正在运行压力测试,并将在发现问题后进行更新。
在运行了更多测试后,我发现:
错误似乎来自
TiledLayerDelegate : CALayerDelegate类。应用程序仅在方法
Dispose from CALayerDelegate is called时崩溃,将方法覆盖为空似乎可以防止应用程序崩溃。运行应用程序似乎不再引起任何问题。很明显,CALayerDelegate 的 Dispose 方法确实出了问题。
-
最后发现:像猴子一样运行应用程序往往会使应用程序升温。我认为这是由于 pdf 页面的密集渲染(它们是大约 4,000 X 3,000 像素的巨大纸张)
protected override void Dispose (bool disposing) { try{ view = null; GC.Collect (2); //base.Dispose (disposing); }catch(Exception e) { //System.Console.Write(e); } }
现在最重要的是,我只是想知道手机发热是否真的像我假设的那样只是 CPU 渲染工作表并且是正常的。有没有人知道如何最好地处理 Dispose 覆盖?
最后一次编辑:对于任何想要防止崩溃的人来说,这是我最后一个版本的图层视图类的样子。
public class TiledPdfView : UIView {
CATiledLayer tiledLayer;
public TiledPdfView (CGRect frame, float scale)
: base (frame)
{
tiledLayer = Layer as CATiledLayer;
tiledLayer.LevelsOfDetail = 4; //4
tiledLayer.LevelsOfDetailBias = 4;//4
tiledLayer.TileSize = new CGSize (1024, 1024);
// here we still need to implement the delegate
tiledLayer.Delegate = new TiledLayerDelegate (this);
Scale = scale;
}
public CGPDFPage Page { get; set; }
public float Scale { get; set; }
public override void Draw (CGRect rect)
{
// empty (on purpose so the delegate will draw)
}
[Export ("layerClass")]
public static Class LayerClass ()
{
// instruct that we want a CATileLayer (not the default CALayer) for the Layer property
return new Class (typeof (CATiledLayer));
}
protected override void Dispose (bool disposing)
{
Cleanup ();
base.Dispose (disposing);
}
private void Cleanup ()
{
InvokeOnMainThread (() => {
tiledLayer.Delegate = null;
this.RemoveFromSuperview ();
this.tiledLayer.RemoveFromSuperLayer ();
});
}
【问题讨论】:
标签: ios xamarin.ios segmentation-fault catiledlayer pdf-viewer