-1

これは非常に単純なコードです。

- (void)functionOne
 {
   [self performSelector:@selector(functionTwo) withObject:nil afterDelay:1.0];
 }
- (void)functionTwo
 {
   [self performSelector:@selector(functionOne) withObject:nil afterDelay:1.0];
 }

ご覧のとおり、これら 2 つのメソッドには、メモリ消費量の増加を引き起こす可能性のあるものは何もありません。しかし、それは成長します。非常にゆっくりですが、そうです。3 秒ごとに約 0.01 MB。なんで?どうすれば回避できますか?

4

3 に答える 3

3

効果的に無限ループを作成しています。オブジェクトの状態を 1 秒ごとに切り替えたい場合 (コメントで述べたように)、次のようにします。

次のようなメソッドを作成します。

- (void)functionOne
{
    if( [obj isEqual:stateA] ) {
        obj = stateB;
    } else {
        obj = stateA;
    }
}

タイマーで呼び出します:

NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self
                               selector:@selector(functionOne) userInfo:nil repeats:YES];
于 2012-12-12T15:46:36.523 に答える
0

アプリケーションが何らかの状態を保持する必要があるという理由だけで、メモリが増加します。perform selector を呼び出すたびに、そのセレクターがスタックにプッシュされます。このスタックはメモリに保存されます。したがって、成長。

于 2012-12-12T15:52:46.697 に答える
0

無限ループを回避するにNSTimerは、オブジェクトの状態を切り替える 1 つの関数を使用する必要があります。

init メソッドで、または次のようなviewDidLoadタイマーを開始する必要があります

- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1.0
        target:self
        selector:@selector(switchState:)
        userInfo:nil
        repeats:YES];
} 

次に、次のような1つの方法を使用します

- (void) switchState:(NSTimer *)timer {
    if ([[self yourState] isEqual:stateOne]) {
        [self setYourState:stateTwo];
    } else {
        [self setYourState:stateOne];
    }
}

詳細については、http://developer.apple.com/library/ios/#documentation/cocoa/reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.htmlを参照してください。

于 2012-12-12T15:48:39.000 に答える