0

問題はNSTimerを停止することです.何らかの理由で[Timer invalidate]が機能しません...

目が石鹸でいっぱいなのかもしれませんが、タイマーが0で止まらなかった理由がわからず、逆に-1、-2、-3...とカウントを戻して...(((

目的地の日付としてエポック番号を使用しています。もう1つ-[タイマー無効化]を使用した「IBAction停止」ボタンは正常に機能します-シミュレーターで押すとタイマーが停止します...

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];


Timer = [NSTimer  scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];

}

- (IBAction) start {

Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];


}
- (IBAction) stop {

[Timer invalidate];
Timer = nil;

}

-(void)updateLabel {

NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
int units = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [calender components:units fromDate:[NSDate date] toDate:destinationDate options:0];
[dateLabel setText:[NSString stringWithFormat:@"%d%c  %d%c  %d%c  %d%c", [components day], 'd', [components hour], 'h', [components minute], 'm', [components second], 's']];

destinationDate = [NSDate dateWithTimeIntervalSince1970:1355299710];

if (!destinationDate) {

    [Timer invalidate];
    Timer = nil;
}
}
4

1 に答える 1

0

Totumus が指摘したように、ifステートメント条件!destinationDateは常に false と評価されるため、updateLabelメソッドがタイマーを無効にすることはありません。

別のバグもあります:

でタイマーを作成し、それへの参照をインスタンス変数viewDidLoadに格納しています。Timer

次に、別のタイマーを作成startし、それへの参照をインスタンス変数に格納して、古いタイマーを無効にすることなくTimer、作成したタイマーへの参照を上書きします。viewDidLoad

これで 2 つのタイマーが実行されましたが、古いタイマーへの参照がないため、無効にすることはできません。

実行ループには、スケジュールされた (実行中の) タイマーへの強い参照があるため、それへのすべての強い参照を削除しても、タイマーは実行し続けることに注意してください。メッセージが存在するのはそのためinvalidateです: タイマーへの強い参照を削除するよう実行ループに指示します。

于 2012-12-12T08:37:59.640 に答える