0

そのため、モバイルWebアプリケーションでメモリリークが発生しました。デスクトップには表示されませんが、モバイルSafariブラウザ(iOS 4、5、6)がクラッシュし、Android OS全体がクラッシュします(バージョン2.2.xで確認済み)。

クラッシュは通常、サイトを長時間開いたままにしておくと発生します。

を使用しております:

  1. headjs(js読み込み用)
  2. yepnope(cssローディング用)
  3. socket.io
  4. jquery mobile

だから私は次の質問があります:

  1. 次のライブラリのどれがメモリリークを引き起こす可能性がありますか?
  2. jqueryセレクターを使用するコードを確認する必要がありますか、それともsocket.ioを慎重に操作する必要がありますか?
  3. スクリプトローダー(headjs、yepnope)に20以上の短いスクリプトをロードすると、メモリリークが発生する可能性がありますか?
4

2 に答える 2

1

問題が見つかったのはいいことですが、Elias が言ったように、使用するフレームワークの数を減らしてみてください。

とにかく JQ Mobile は jQuery に依存しているため (必要なときにそこにあるため)、HeadJS と YepNope を削除し、jQuery の $.get() でリソースをロードすることを強くお勧めします。

冗長な機能を含める必要はありません。

とは言え、headの最新版にcssローディングを追加したのですが、正直なところjqueryを既に使っていてレスポンシブデザインのパーツを使っていないのであれば、あまり必要ありません。

于 2012-11-15T09:16:15.597 に答える
1

jQ mobile は、注意しないとリークが発生することが知られています。全体として、特にそれらを一緒に使用している場合、リストした 4 つのツールキットすべてが問題を引き起こす可能性があると思います。
おそらく、あなたができる最善のことは、可能な限り 1 つのライブラリに固執し、リークを最小限に抑えるような方法で使用することに集中することです。モバイル ブラウザーの問題は、より多くのクロージャー マジックが進行中であり、JS エンジンは (まだ) あまり知られていない/理解されていないことです。タッチ デバイス用の JS イベント デリゲーション コードの記述に手を出したことがある場合は、驚くほど多くのクロージャーと、GC が間に合わない可能性がある DOM 参照があることに気付いたに違いありません。これについてあなたができることはそれほど多くありません。

一般的に、私はあまりにも多くのライブラリを使用することを避ける傾向があります (私は、正直に言うと、どのライブラリも使用しないようにクロールして攻撃する人々の 1 人です)。しかし、どのように表現しても、headjs と jQueryreadyが想像できるすべての方法でイベントをチェックする傾向の組み合わせは面倒かもしれません: 新しい要素を動的にロードしていますが、これが jQ のreadyイベントを複数回トリガーするかどうかを確認しましたか? その場合、ほとんどの場合、同じハンドラーを何度も何度もバインドしています。各 ajax リクエストは、他のツールキットも同じことを行うようにトリガーする可能性があり、それにより jQuery が再度トリガーされ、さらに他のライブラリが再度トリガーされる可能性があります。
あなたは写真を手に入れました。私は専門家ではありませんが、1 つのライブラリが別のライブラリをトリガーする可能性があり、その逆もあり、デッドロック シナリオが発生する可能性があると推測します。ready私はこれを、私がしばらく前に遭遇した同様の問題の漠然とした思い出に基づいています。また、さまざまなライブラリを使用してスクリプト/CSS を動的にロードしているという事実、および jQ がすべてのリスナーを最後にアンバインドしないという事実に基づいています。確認した時間。私の勘が正しければ、のグローバル変数をクイックフィックスとして使用できます。

var jQReady = false;
jQuery(document).load(function()
{
    if (jQReady === true)
    {//was loaded
        return;
    }
    jQready = true;//<-- set to true on first invocation of callback
});
于 2012-11-05T11:35:40.373 に答える