1

ビューのプロパティとして、次のような配列の配列があります。

@interface MyView : UIView

@property (nonatomic) CGPoint **matrix;

@end

このビューを所有するコントローラーで、次のように-viewDidLoadにデータをロードし、-viewDidUnloadにメモリを解放しました。

- (void)viewDidLoad
{

    self.myView.matrix = malloc(sizeof(CGPoint*) * array1Size);
    for (int k = 0; k < array1Size; k++) {
        self.myView.matrix[k] = malloc(sizeof(CGPoint) * innerArraySize);
    }
}

- (void)viewDidUnload
{
    for (int k = 0; k < array1Size; k++) {
        free(self.myView.matrix[k]);
        self.myView.matrix[k] = nil;
    }
    free(self.myView.matrix);
    self.myView.matrix = nil;
    [self setMyView:nil];
    [super viewDidUnload];
}

プロファイリング中に、ここにリークがあります。誰かが私が間違っているところを助けてくれますか?

ありがとう

更新

私はviewDidUnloadから無料のコードを削除し、次のようにdeallocを使用しようとします:

-(void)dealloc {
    [self freeArray];
}

- (void) freeArray {

    for (int k = 0; k < 5; k++) {
        free(self.myView.matrix[k]);
        self.myView.matrix[k] = NULL;
    }

    free(self.myView.matrix);
    self.myView.matrix = NULL;
}

次に、initコードを次の場所に埋め込みます。

if (self.graphView.matrix == NULL) {
    ...
}

もう漏れはありません、ありがとう!

4

2 に答える 2

3

あなたのコードは、マトリックスの各セットアップが正確に 1 つの破棄によって一致することを確認していません。たとえば、viewDidUnloadが呼び出される保証はありません。また、重複したセットアップや破棄に対するガードはありません。

配列の C 配列が本当に必要な場合は、ビュー (initWithFrame:またはinitWithCoder:) の初期化子で作成し、その .xml で削除することをお勧めしますdealloc

編集:deallocおよび ARCに関する懸念を軽減するには:

確かに、ARC で dealloc をオーバーライドして、それが呼び出されることに依存できます。唯一の違いは、オーバーライドされた実装 ( ) を明示的に呼び出すことができないことです[super dealloc]。ARC がそれを挿入します。

于 2012-09-06T19:29:29.853 に答える