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 内存泄漏导致应用程序无法使用的主要内容,如果未能解决你的问题,请参考以下文章