我们正在开发一个混合应用程序,我们在我们的应用程序中使用谷歌地图API.当我们尝试在地图中加载2000个数据标记时,它会崩溃.地图不会在IOS6,IOS5中崩溃.它只发生在IOS7中.是否有任何与ios7应用程序相关的内存相关更改.
小智 13
如前所述,iOS7对内存使用的要求更严格.在Chrome等其他浏览器中会出现此问题,因此当应用程序达到内存使用量的上限时,会出现崩溃.
我只使用Gmaps javascript API和jQuery隔离了两个测试用例:
使用100个标记进行测试:一切都可以
http://jsfiddle.net/edfFq/6/embedded/result
使用3000个标记进行测试:发生崩溃
http://jsfiddle.net/edfFq/7/embedded/result/
$(document).ready(function () {
var map;
var centerPosition = new google.maps.LatLng(40.747688, -74.004142);
var options = {
zoom: 2,
center: centerPosition,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map($('#map')[0], options);
for (var i=0;i<2800;i++){
var position = new google.maps.LatLng(40*Math.random(),-74*Math.random());
var marker = new google.maps.Marker({
position: position,
map: map
});
}
});
Run Code Online (Sandbox Code Playgroud)
如果您的地图使用标签,自定义图标和群集,则可以使用较少数量的标记来获取崩溃.
遇到谷歌地图的类似问题后,我试图找出一个最小的测试用例.我想看看这是否是一个更普遍的内存管理问题.
这个只是将随机数据存储在一个数组中的代码崩溃了iPad mini上的Safari,16GB:
function randomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
return result;
}
var arr = []
for (var i=0;i<5000;i++) {
// one character is two bytes in JavaScript, so 512 chars is 1Kb:
o = randomString(512, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
arr.push(o);
}
Run Code Online (Sandbox Code Playgroud)
您可以访问http://vici.org/memtest.html,使用自己的浏览器尝试此测试.该页面上的脚本将尝试以1Mb为单位声明50Mb的内存.该脚本显示一个正在运行的计数器,以便您了解浏览器的执行情况以及崩溃的时间(如果有).该脚本将每个ip/user代理组合的结果存储在数据库中,以便得出一些结论.
平均而言,IOS 6(n = 12)允许脚本声称大约12Mb.IOS 7(n = 47)允许脚本声称大约15 Mb.这些都不是硬限制.对于两组,标准偏差都很高,约为12 Mb.在Xcode模拟器中,Safari甚至根本没有崩溃(声称完整的50Mb,可能是因为它可以访问更多的RAM).
因此,我们可以得出结论,问题不是由IOS 7造成的,而是为Safari留下更少的内存.正如PhilippKühn所暗示的那样,问题似乎是 - 在某些具体情况下?- Safari消耗的内存比IOS 6中的内存大得多.有关原因的一个线索可以在https://discussions.apple.com/message/23837361#23837361找到,其中一个页面有200个div和下面的CSS
div {
-webkit-backface-visibility: hidden;
}
Run Code Online (Sandbox Code Playgroud)
崩溃的野生动物园.
看来使用Leaflet库会绕过地图问题(请参阅https://code.google.com/p/gmaps-api-issues/issues/detail?id=和https://github.com/Leaflet/Leaflet/ pull/2149)然而,Leaflet规避了低内存崩溃,而不是通过css上的更改,而是在javascript级别上.传单现在绕开了像
context = this
Run Code Online (Sandbox Code Playgroud)
这表明Safari不会清理未使用的对象.只要Apple不修复Safari,也许谷歌可以做一些类似于Leaflet人员所做的改变?
与此同时,Apple发布的IOS7.1并没有完全解决崩溃问题,但肯定会让它们经常发生.
我们有一个web应用程序,在iOS7上也有很多标记.所以我们仔细看看iPad使用的内存.
带有iOS7的iPad mini(和iPad3):
内存使用率越来越高,浏览器崩溃在300-400MB之间.
iPad 3搭配iOS6
内存使用量约为200MB,一切都很好.
带iOS5的iPad 1
内存使用量只有大约100MB,一切都很好.
结论
因此,这是不是只是一个内存限制-它肯定在iOS的Safari一个巨大的错误!到目前为止(iOS 7.0.3),这不是固定的.
| 归档时间: |
|
| 查看次数: |
19515 次 |
| 最近记录: |