3

アプリのメモリ リークをテストしたところ、間隔を空けて NSTimer を開始すると、CFArray (store-deque) と CFArray (mutable-variable) のサイズが大きくなり続けていることがわかりました。私の実際のアプリでは、Malloc 16 や Malloc 32 などは CFArray と一緒にサイズが大きくなります。

質問: この「リーク」を止めるにはどうすればよいですか?

コード: .h

@interface ViewController : UIViewController
{
    NSTimer *timerClock;
    int timer;
}
@end

コード: .m

- (void)viewDidLoad
{
    [super viewDidLoad];

    timer = 0;
    timerClock = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(counter) userInfo:nil repeats:YES];
}

- (void)counter
{

}
@end
4

1 に答える 1

5

ビュー コントローラーを閉じると、これが表示されますか? これをお願いするのは、繰り返しNSTimerが強い参照を保持しているためです。ビュー コントローラーを閉じるときにタイマーを使用targetしないと、強力な参照サイクル (保持) が発生するため、タイマーとコントローラー自体の両方がリークします。サイクル) コントローラと の間。invalidateNSTimer

ちなみに、強い参照サイクルでは決して呼び出されないためinvalidate、コントローラーのメソッドで を試みないでください。多くの場合、人々は入ります。そして、明らかに、 でタイマーを使用する場合は、タイマーの作成とその呼び出しのバランスを取るために、ではなく で作成する必要があります。deallocdeallocinvalidateviewDidDisappearinvalidateviewDidDisappearviewDidAppearviewDidLoadinvalidate

于 2013-03-01T04:22:52.867 に答える