0

NSThread次のコードを実行するがあります。

for (Experiment *exp in experiments) {
    ExperimentBlock *block = [[ExperimentBlock alloc] initWithFrame:CGRectMake(0, maxHeight, 310, 50)
                                                         experiment:exp
                                                             target:self
                                                             action:@selector(onExperimentButtonClicked:)];
    [scrollView addSubview:block];
    // block cannot be released for some inadequately explained reason
    maxHeight += 60;
}

優れたメモリ管理方法では、割り当て、コピー、または新規作成したオブジェクトをすべて解放する必要があります。ただし、スレッドが終了したときに、追加したブロックを解放(または自動解放)したUIScrollView場合、オブジェクトはUIScrollView1秒間表示されてから、消えます。

これらのオブジェクトを失うことなくメモリを解放するにはどうすればよいですか?

4

1 に答える 1

4

addSubview:バックグラウンドスレッドのビュー(呼び出し)を変更しないでください。これがあなたが奇妙な行動をしている理由です。addSubview:メインスレッドを呼び出す必要があります。

このタイプの作業は、通常、GCDまたはで行う方がはるかに優れていNSOperationQueueます。ほとんどの場合、手動NSThreadは効率が低く、正しくコーディングするのがより困難です。addSubview:次のように、通話をメインキューに移動できます。

dispatch_async(dispatch_get_main_queue(), ^{
  [self.scrollView addSubview:block];
  [block release];
});

ここへの呼び出しselfは意図的なものです。これにより、このコードが実行されるまで割り当てを解除できないようにする一時的な保持ループが作成されます。

このプロジェクトをARCに切り替えると、ここでのメモリ管理が簡素化されるため、お勧めします。

于 2013-02-14T19:57:11.087 に答える