1

それは本当に奇妙です。-touchesEnded:、-touchesMoved、および -touchesBegan: メソッドを実装する空白の UIImageView サブクラスがあります。これらのメソッドの実装は空です。彼らはただ何もしません。ただし、「Leaks」を使用して Instruments を実行し、UIImageView に触れて、画面に触れたまま UIImageView の外に指を移動すると、Instruments からメモリ リークの警告が表示されます。

私のデモアプリでは、それを行うときにオブジェクトの割り当ては発生しません。メソッドは空です。Instruments で読んだものはすべて、Foundation と Run Loop に関するものです。クラスを 2 回チェックし、オブジェクトの割り当てを削除しました。画像を表示するだけのスケルトンですが、画面に触れたり指を動かしたりしても、その画像は変化しません。それは意味がありません。

他の誰かがこのような問題に遭遇しましたか?

更新:もう少しテストして、5 本の指ですばやくタップすると、画面上の任意の場所でメモリ リークが発生することがわかりました。Instruments.app から得られるものはすべて、いくつかの実行ループとイベント ループに関するものです。デバイスがタッチを十分に速く処理できず、割り当てられたオブジェクトを解放するときにスタックするようです。試してみて、同じ問題が見られる場合は、ここに報告してください。

更新:いくつかの Apple サンプル アプリもテストしました。通常のユーザーが行うように、画面上で 3 ~ 5 本の指でハックすると (はい、そうします!)、Instrument はイベントと実行ループに関するメモリ リークを表示します。確かに、フレームワークや楽器には大きなものがあります。iPhone OS 2.2.1 でテスト済み。

4

1 に答える 1

2

Apple フォーラムで読んでいるように、これは SDK の未解決の問題です。加速度計のデリゲートが nil でない場合に発生します。タッチ イベント オブジェクトは割り当てられますが、解放されることはありません。加速度計のデリゲートが呼び出されるのが速いほど、これらの割り当ての失敗が早く発生します。Apple のサンプル コードの多くは、同じ問題を示しています。加速度計をオンにしました。

しかし、あるビューから別のビューへのタッチが追跡されると、この種のリークが発生することにも遭遇しました。同じビューに触れ続け、そのビューを離れずに指を動かし続けると、その問題は発生しません。

解決策: 加速度計をオフにして (デリゲートを nil に設定)、アプリのビューの量を減らします。iPhone OS 3.0 でその問題が修正されたかどうかはわかりません。

残念ながら、これは役に立ちません:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; // because of framework bug
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [[UIAccelerometer sharedAccelerometer] setDelegate:self]; // because of framework bug
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [[UIAccelerometer sharedAccelerometer] setDelegate:self]; // because of framework bug
}

詳細: http://discussions.apple.com/thread.jspa?messageID=9396584t

于 2009-06-03T10:48:36.777 に答える