1

タイマーを実装しようとしていますが、アクセスが悪いです...私はリリースもdeallocでも使用しませんでした。

.h 

   NSTimer *_timerAnimacao;

@property (nonatomic, retain) NSTimer *timerAnimacao;

.m 
@synthesize timerAnimacao = _timerAnimacao;

ここでタイマーを呼び出します。

  if(acondition)
       _timerAnimacao = [NSTimer scheduledTimerWithTimeInterval:0.06 target:self selector:@selector(changeTimeFilter:) userInfo:nil repeats:YES];
     else 
            _timerAnimacao = [NSTimer scheduledTimerWithTimeInterval:0.06 target:self selector:@selector(changeTimeFilterHide:) userInfo:nil repeats:YES];

正常にchangeTimeFilter動作します...しかし、 BAD AccesschangeTimeFilterHideを取得しています。

-(void)changeTimeFilter:(NSTimer *)theTimer{

    if (tAnimacaoFilter<5) {
        [_tbFilters setFrame:CGRectMake(_tbFilters.frame.origin.x, _tbFilters.frame.origin.y, _tbFilters.frame.size.width, 58*tAnimacaoFilter)];
    }
    if(tAnimacaoFilter < 10) {
        tAnimacaoFilter++;
        [_tbFeeds setFrame:CGRectMake(_tbFeeds.frame.origin.x, _tbFeeds.frame.origin.y + (4.4*tAnimacaoFilter), _tbFeeds.frame.size.width, _tbFeeds.frame.size.height - (4.4*tAnimacaoFilter))];
        [imgBordaTbDireita setFrame:CGRectMake(imgBordaTbDireita.frame.origin.x, _tbFeeds.frame.origin.y - 4, imgBordaTbDireita.frame.size.width, imgBordaTbDireita.frame.size.height)];
        [imgBordaTbEsquerda setFrame:CGRectMake(imgBordaTbEsquerda.frame.origin.x, _tbFeeds.frame.origin.y, imgBordaTbEsquerda.frame.size.width, imgBordaTbEsquerda.frame.size.height)];
    }
    else {
        if(_timerAnimacao)
           [_timerAnimacao invalidate];
        [btnFilter setEnabled:YES];
    }
}

-(void)changeTimeFilterHide:(NSTimer *)theTimer{
    if (tAnimacaoFilter<5) {
        [_tbFilters setFrame:CGRectMake(_tbFilters.frame.origin.x, _tbFilters.frame.origin.y, _tbFilters.frame.size.width, (58*5) - (58*tAnimacaoFilter))];
    }
    if(tAnimacaoFilter < 10) {
        tAnimacaoFilter++;
        [_tbFeeds setFrame:CGRectMake(_tbFeeds.frame.origin.x, _tbFeeds.frame.origin.y - (4.4*tAnimacaoFilter), _tbFeeds.frame.size.width, _tbFeeds.frame.size.height + (4.4*tAnimacaoFilter))];
        [imgBordaTbDireita setFrame:CGRectMake(imgBordaTbDireita.frame.origin.x, _tbFeeds.frame.origin.y - 4, imgBordaTbDireita.frame.size.width, imgBordaTbDireita.frame.size.height)];
        [imgBordaTbEsquerda setFrame:CGRectMake(imgBordaTbEsquerda.frame.origin.x, _tbFeeds.frame.origin.y, imgBordaTbEsquerda.frame.size.width, imgBordaTbEsquerda.frame.size.height)];
    }

    else {
        if(_timerAnimacao)
            [_timerAnimacao invalidate];
        [btnFilter setEnabled:YES];
    }
}
4

2 に答える 2

2

無効にする必要があるのは、次のように NSTimer を nil に設定することです。

[_timerAnimacao invalidate];
_timerAnimacao = nil;

そうしないと、次のコマンドが正しく機能しません。たとえば、次のようになります。

if(_timerAnimacao)
  [_timerAnimacao invalidate];

注意してください:if(_timerAnimacao)のように同じif(_timerAnimacao == nil)です !

こちらもご覧ください: How do I use NSTimer?

于 2013-08-05T13:17:46.427 に答える
0

NSTimer のインスタンスは、開始して無効化する間、メモリ内に存在する必要があります。

次の 2 つの方法でそれを行うことができます。

  1. NSTimer を Appdelegate クラスのプロパティとして設定し、必要な場所で使用します。

    NSTimer *timer=[(MyAppDelegate *)[[UIApplication sharedApplication] delegate].timer;

  2. 新しいクラスを作成し、NStimer をプロパティとして設定します。クラスのシングルトン インスタンスを返すクラス メソッドを作成します。

    static MyClass *obj = NULL;

    • (MyClass *)instance { @synchronized(self) { if (obj == NULL) obj = [[self alloc] init]; }

      戻ります (obj); }

私は2番目の方法を好むでしょう。

于 2013-08-05T13:58:33.193 に答える