iOS Safari 内存泄漏导致应用程序无法使用

Posted

技术标签:

【中文标题】iOS Safari 内存泄漏导致应用程序无法使用【英文标题】:iOS Safari memory leak makes Apps unusable 【发布时间】:2016-01-03 00:47:10 【问题描述】:

我的网络应用程序中有一个“可编辑表格”。它的工作原理是,当您单击表格的 td 时,我会读取 td 的 innerhtml 并生成一个输入字段,我将其与 innerHTML 的值一起注入到 td 中。

当您模糊/聚焦输入字段时,我会销毁输入字段并设置新值的 innerHTML,并发送 AJAX 请求以更新该字段。这在台式机和安卓手机上完美运行,但在 ios Safari 上,您编辑的值越多,它的速度就会越慢。大约后。 250 次编辑,滚动将变得非常不稳定,最终页面将变得几乎无法使用。页面刷新并不能解决问题,它需要您完全关闭网页并重新开始。

这让我相信 Safari 并没有释放被破坏的输入字段的内存。

下面给出了相关的 javascript 代码,并在点击 td 时触发:

_handleEditing: function($td) 
    var value = $td.find("span").html().replace(",", ""),
        ctrl = this;

    $td.unbind('click');

    // Clone the input control
    var $editControl = $('#input .edit-control').clone();

    if(this.isMobile) 
        $editControl.attr('type', 'number');
        $editControl.attr('step', '0.01');
    

    // Inject editControl into td html and set appropriate values
    $td.html($editControl);
    $editControl.val(value);

    // Focus the edit control and set the selection range
    $editControl.focus();

    setTimeout(function() 
        $editControl.get(0).setSelectionRange(0, value.length);
    , 0);

    firstKeydown = true;

    // Handle leaving the input field and returning to normal number
    $editControl.on('blur', function()
        var newValue = $editControl.val();

        // If the newValue is empty, go back to the old value
        newValue = (newValue === '') ? value : newValue;

        var parsedNewValue = parseFloat(newValue).toFixed(2);

        // If the newValue is not actually a number, go back to the old value
        newValue = isFinite(parsedNewValue) ? parsedNewValue : value;

        $editControl.unbind().remove();
        $editControl = null;

        $td.html("<span>"+newValue+"</span>");

        // Queue this value update to server
        if(parseFloat(newValue) !== parseFloat(value)) 
            ctrl.handleValueChanged($td, value, newValue);
        

        // Reinstate the click handler on the td
        $td.click(function()
            ctrl._handleEditing($td);
        );
    );

    this._attachNavigationHandlers($editControl);

,

我们将不胜感激任何帮助。 请苹果开发者帮忙

【问题讨论】:

【参考方案1】:

根据我针对类似问题(iOS 上的性能逐渐下降)所做的研究,我发现许多来源表明这是 iOS 本身的问题。

iOS 9 中的性能问题似乎与 Safari 中的错误有关。无论您使用的是 Safari、UIWebView 还是 WKWebView……每次选择文本输入字段时,您都会注意到性能下降。我创建了一个包含 100 个文本输入的基本 html 页面……当我遍历输入几次时,应用程序最终变得对手势没有响应。 Webview/Webkit(我知道)中唯一的解决方案是重新启动应用程序。

参考: https://forums.developer.apple.com/thread/21956

截至目前,似乎还没有解决方案。就我而言,当用户注销时,我会强制关闭应用程序。不幸的是,如果您想在 App Store 上发布您的应用,您不能以编程方式退出您的应用。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。

以上是关于iOS Safari 内存泄漏导致应用程序无法使用的主要内容,如果未能解决你的问题,请参考以下文章

在 Safari 桌面和 iOS 中分析内存的技术?

常见的内存泄漏原因及解决方法

使用 Safari Web 检查器调试内存泄漏?

iOS - 调整图像大小导致内存泄漏

内存溢出和内存泄漏

ios在画布上使用display:none绘制图像导致内存泄漏