使用新的PageCurl效果读取带有MonoTouch和iOS 5.0的PDF时出现奇怪的崩溃
在使用MonoTouch和iOS 5.0阅读PDF时,我遇到了一个奇怪的崩溃。 我为MonoDevelop 2.8制作了一个简单的测试用例项目,并上传到GitHub上: 似乎有些东西太早获得GCd并终止了应用程序,但我找不到什么。我试着用多种方法处理一切,但都白费了。我已经向Xamarin团队提交了tarball项目,但他们无法解决这个问题 iOS NavigationController内存管理中是否有故障?还是我遗漏了什么 感谢您的帮助,谢谢 更新:在处理所有类中的对象之前,我尝试删除所有子视图和子层,但仍然失败。我发现避免崩溃的唯一方法是永远不要处理PDF页面,在发布它们之前将它们添加到列表中,但这不是一个可行的解决方案,因为这样一来,对于具有许多页面的PDF,内存会被快速消耗,而当无法为下一页分配内存时,应用程序也会崩溃。 另一种避免崩溃的方法是在翻页之前处理PDF页面,在创建新的页面控制器之前在页面控制器上强制使用dispose方法,但这样当前页面将变为空白,转换将卷曲一个无用的空页面。似乎没有解决办法 我已经用我尝试过的3种不同的解决方案更新了GitHub上的project(查看PageDataSource类),您可以一次取消一个注释以查看问题使用新的PageCurl效果读取带有MonoTouch和iOS 5.0的PDF时出现奇怪的崩溃,ios,pdf,uinavigationcontroller,garbage-collection,xamarin.ios,Ios,Pdf,Uinavigationcontroller,Garbage Collection,Xamarin.ios,在使用MonoTouch和iOS 5.0阅读PDF时,我遇到了一个奇怪的崩溃。 我为MonoDevelop 2.8制作了一个简单的测试用例项目,并上传到GitHub上: 似乎有些东西太早获得GCd并终止了应用程序,但我找不到什么。我试着用多种方法处理一切,但都白费了。我已经向Xamarin团队提交了tarball项目,但他们无法解决这个问题 iOS NavigationController内存管理中是否有故障?还是我遗漏了什么 感谢您的帮助,谢谢 更新:在处理所有类中的对象之前,我尝试删除所有
//SOLUTION 1
void ForcingPageControllerDispose (BookPageController oldPageController)
{
// --- IF YOU UNCOMMENT THIS, THE CRASHES GO AWAY, BUT THE PAGE IN THE TRANSITION IS BLANK, SO IS NOT VIABLE
currentPageController.View.RemoveFromSuperview ();
currentPageController.Dispose ();
}
//SOLUTION 2
void DisposeThePageControllerWhenDidFinishAnimating (BookPageController oldPageController, UIPageViewController pageViewController)
{
// --- IF YOU UNCOMMENT THIS, THE CRASHES STILL HAPPEN
pageViewController.DidFinishAnimating += delegate(object sender, UIPageViewFinishedAnimationEventArgs e) {
if (currentPageController != null) {
currentPageController.View.RemoveFromSuperview ();
currentPageController.Dispose ();
Console.WriteLine ("currentPageController disposed for page: " + currentPageController.PageIndex);
}
};
}
//SOLUTION 3
void BackupUnusedPagesToAvoidBeingGCd (BookPageController oldPageController)
{
// --- IF YOU UNCOMMENT THIS, THE CRASHES GO AWAY, BUT THE PAGES ARE NOT GARBAGE COLLECTED AND AFTER MANY PAGES IPHONE IS OUT OF MEMORY AND IT CRASHES THE APP
if (parentController.book_page_controllers_reference_list.Contains (currentPageController) == false)
parentController.book_page_controllers_reference_list.Add (currentPageController);
}
我已经向Xamarin团队提交了tarball项目,但他们无法解决这个问题
我很肯定负责你案子的人会想出解决办法的。测试用例越大,花费的时间就越多
快速查看AppDelegate.cs中的以下内容是错误的:
PageTurnViewController viewController = new PageTurnViewController ("PageTurnViewController", null);
window.AddSubview (viewController.View);
因为本地viewController
实例在FinishedLaunching
返回后将不会对其进行任何引用,GC将能够收集它。但是,为了保持视图
完全有效,需要使用它(在本机端)。这可能导致崩溃(也可能有其他情况,这是我今早检查的第一个也是唯一一个文件)
解决方案是将viewController
升级为字段。这将使它处于活动状态
,即使该方法返回,也会使它不可用于收集
更新
我在github上快速查看了您的代码
- 您正在添加(子)视图,但从未删除它们(当GC处理它们时,它不会将它们从超级视图中删除)
- 您正在丢失对视图的引用,例如在
PageDataSource.cs
newPageController = new BookPageController (nextPageIndex, parentController.currentPDFdocument, parentController); return newPageController;
newPageController
中已经存储了一个引用,该引用将被覆盖,并使对象可收集bug成为GC。由于(子)视图从未被删除,因此仍然可能存在对它们的本机引用,从而导致崩溃
对于调试,您可以添加自己的终结器,例如
~BookPageController ()
{
Console.WriteLine ("bu-bye");
}
并在其中设置断点。如果它们被击中,而您认为它仍在使用,那么您可能会发现问题。由于您依赖iOS 5的新功能,您还应该在iOS 5中采用新的视图控制器包含API,以解决视图控制器的一些问题
我建议您查看WWDC视频和幻灯片,了解会话102“实施UIViewController控制”。谢谢,即使这只是一个测试用例,您也说得对。但不幸的是,崩溃发生在从这种方法返回之前。我尝试按照您的建议放置viewController引用,但没有成功。该应用程序在翻页时仍会崩溃。这可能是无关的,但在其他地方也可能是类似的问题。请注意,您有大约10-15秒的时间从
FinishedLaunching
方法返回,否则iOS看门狗将杀死您的应用程序(因此我非常确定您的崩溃发生在该方法返回后)。我已更新了我的帖子:不幸的是,您关于在处理之前删除子视图的建议不起作用(如果没有实际的崩溃日志,很难确定哪里出了问题。也许可以在bugzilla.xamarin.com中提交一个bug,并提供相关信息?我已将该bug提交到bugzilla.xamarin.com。您可以在此处找到它: