1

編集:配列を初期化した直後に配列を手動で保持するための単一の呼び出しに固執し、それで修正されました。デュル。ありがとう。

UIScrollView サブクラスに NSMutableArray を保持し、UIImageView サブクラスのインスタンスをそれぞれサブビューとして追加します。最終的には配列内の順序を再配置する予定であるため、変更可能な配列である必要があります。このバグは、私がそうしようとする前に発生しています。NSLogs を使用して、AppDelegate で applicationDidBecomeActive: が呼び出されるまで、配列が 10 カウントであることを示し、実行ループで 0.001 秒ごとに起動するタイマーを追加しました。初めて起動すると、配列が見つかりません! 私は非常に混乱しており、これを何時間も追跡しようとしています.

タイマーは正常に動作しています (つまり、printCount: が配列にアクセスしない場合は問題ありません)。そこで配列にアクセスしようとすると、タイマーが壊れます。以下の printCount: への通常の呼び出しは機能しますが、タイマーが最初に起動したときに、printCount: へのこれら 2 つの呼び出しの間で何が起こっている可能性がありますか?

- (void)applicationDidBecomeActive:(UIApplication *)application {
    NSTimer *timer = [[NSTimer scheduledTimerWithTimeInterval:0.001f
                                                       target:[viewController view]
                                                     selector:@selector(printCount)
                                                     userInfo:nil
                                                      repeats:YES]
                      retain];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [[viewController view] printCount];
}

私は、デバッガーを使用してプログラムを際限なくステップ実行してきました。配列はこの時点まで正しく、内容が変更された後でもそのメモリ アドレスは同じです。ただし、その後はオブジェクトしかありません。その 10 個の要素は、単一の UITouchData インスタンスに置き換えられます。どこから来たのかわからない。私のイベント処理メソッドはどれも、配列の再割り当てや変更を試みません。何がうまくいかないのでしょうか?私は完全に当​​惑しています。

4

5 に答える 5

2

あなた-retainは配列でしたか?

于 2010-01-15T17:25:00.663 に答える
0

配列を初期化した直後に保持するための呼び出しに固執しましたが、それで修正されました。デュル。

提案していただきありがとうございます。このような問題でよくあることですが、それは非常に単純で、最終的にはあきらめて助けを求めることが解決策の引き金となり、私はばかげていると感じます. :D

于 2010-01-15T17:37:55.853 に答える
0

ビューは配列を初期化して解放しますか?
間に NSView がリリースされていないことは確かですか? タイマーが呼び出すたびに(== self within )
のメモリアドレスが同じかどうかを確認できます。 [viewController view]printCountprintCount

于 2010-01-15T17:38:18.187 に答える
0

おそらくあなたのオブジェクトは解放されましたか?保持するとどうなるか。それは機能しますか、それともメモリリークが発生するだけですか?

于 2010-01-15T17:25:04.810 に答える
0

その 10 個の要素は、単一の UITouchData インスタンスに置き換えられます。どこから来たのかわからない。

それは常に UITouchData インスタンスですか? いつも?-- 原因は、(毎回同じではない場合) メモリの問題の死んだギブアウェイのように見えます。

于 2010-01-15T17:29:56.493 に答える