1

この問題に何時間も座った後(私は本当にドラゴンの卵に乗った鶏のように感じます)、私はここに来て尋ねます。

問題は次のとおりです。タイマー(mach_absolute_time()で作成)を使用した非同期キューがあり、一定の時間間隔が経過すると、NSNotificationがdefaultCenterに渡され、メソッドが実行されます。runメソッドには、ビューの交差を見つけるためのメソッド呼び出しがあります。私は最近ARCに切り替えました。それは本当に良い考えのようだったからです。少し残念ですが、ARC以前から、このコードは正しく割り当ておよび割り当て解除されましたが、現在はそれ自体のみを割り当てています。手動で割り当てを解除するためのコードが欠落している可能性がありますが、ビューをnilに設定しようとすると、まったく役に立ちませんでした。また、Allocationsでは、その交差メソッドのためにmalloc 4.00 KBが上昇し続けます。これが、しばらくすると制限に達したときにメモリ警告が表示され、アプリがクラッシュするため、私が尋ねる理由です。

この方法が必要な理由は、障害物のあるビューのサブビューを反復処理するためです。そして、いくつかのサブビューからの別のビューの距離が限界に達したとき、私はいくつかのコードを実行します。

さて、いくつかのコードについて:これは非常に多くのメモリを割り当てるメソッドであり、正確にはその最初の行です(ARC以前はずっと長かったのですが、割り当てを作成するものを取得するために減らしました)。削除すると、無限の割り当てが停止します。もう一度注意してください。このメソッドは、1秒間に非常に多くの回数呼び出され、メインキューとは別のキューで呼び出されます。

- (BOOL)obstacleIntersect {
    UIView *view = [[self subviews] objectAtIndex:0];
    return NO;
}

そして、これは割り当てでどのように見えるかです: 割り当て

この長い質問の終わりに達したばかりなので、助けてくれてありがとう。

編集:これは、コードがすべての機能などでどのように見えるかです。上記のコードを1行だけで投稿した理由は、正常に機能するかどうかは気にしないため、割り当てを解決したいだけです。問題。誤解を招く恐れがあります。uiviewパーティクルは、前述のサブビューと交差するビューです。このコードも同じ無限の割り当てを生成します。

- (BOOL)obstacleIntersect {
    for(UIView *view in [[[self subviews] objectAtIndex:0] subviews])
    {
        if (sqrt(pow(abs(particle.center.x - view.center.x), 2) + pow(abs(particle.center.y    - view.center.y), 2)) < particle.frame.size.width / 2 - 1) 
        {            
            return YES;   
        }
    }
    return NO;
}
4

1 に答える 1

0

このコードが実行ループの1回の反復内で何度も呼び出され、に多数の項目があるsubviews場合は、自動解放プールで問題が発生している可能性があります。たとえば、サブビュー配列は自動解放されます。 ARCがすぐに削除しない理由を確認してください。このメソッドの呼び出しを独自の自動解放ブロックでラップしてみることができます。

BOOL intersects;
@autoreleasepool { intersects = [self obstacleIntersect];}
// do something with intersects...

私はこれが推測であることを自由に認めますが。

ローカル自動リリースプールに関するいくつかのドキュメントと、それを使用する理由については、こちらを参照してください。

于 2012-08-07T11:27:08.927 に答える