Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用新的PageCurl效果读取带有MonoTouch和iOS 5.0的PDF时出现奇怪的崩溃_Ios_Pdf_Uinavigationcontroller_Garbage Collection_Xamarin.ios - Fatal编程技术网

使用新的PageCurl效果读取带有MonoTouch和iOS 5.0的PDF时出现奇怪的崩溃

使用新的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内存管理中是否有故障?还是我遗漏了什么 感谢您的帮助,谢谢 更新:在处理所有类中的对象之前,我尝试删除所有

在使用MonoTouch和iOS 5.0阅读PDF时,我遇到了一个奇怪的崩溃。 我为MonoDevelop 2.8制作了一个简单的测试用例项目,并上传到GitHub上:

似乎有些东西太早获得GCd并终止了应用程序,但我找不到什么。我试着用多种方法处理一切,但都白费了。我已经向Xamarin团队提交了tarball项目,但他们无法解决这个问题

iOS NavigationController内存管理中是否有故障?还是我遗漏了什么

感谢您的帮助,谢谢

更新:在处理所有类中的对象之前,我尝试删除所有子视图和子层,但仍然失败。我发现避免崩溃的唯一方法是永远不要处理PDF页面,在发布它们之前将它们添加到列表中,但这不是一个可行的解决方案,因为这样一来,对于具有许多页面的PDF,内存会被快速消耗,而当无法为下一页分配内存时,应用程序也会崩溃。 另一种避免崩溃的方法是在翻页之前处理PDF页面,在创建新的页面控制器之前在页面控制器上强制使用dispose方法,但这样当前页面将变为空白,转换将卷曲一个无用的空页面。似乎没有解决办法

我已经用我尝试过的3种不同的解决方案更新了GitHub上的project(查看PageDataSource类),您可以一次取消一个注释以查看问题

        //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。您可以在此处找到它: