1

iOS 7 で使用するとクラッシュし+[NSTimer scheduledTimerWithTimeInterval:invocation:repeats]ます。コードは簡単です。ここにコピーペースト(変数の名前を変更したもの)全体があります。

SEL selector = @selector(callback);
NSMethodSignature *signature = [self methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:self];
[NSTimer scheduledTimerWithTimeInterval:0.5 invocation:invocation repeats:NO];

タイマーが起動すると、次のスタック トレースでアプリがクラッシュします。

ここに画像の説明を入力

変数の 1 つが保持されなくなったのではないかと考えたので (NSTimer のドキュメントには、参照されたすべてのパラメーターが保持されると記載されていますが)、すべての変数を に強く保持しましたself。残念ながら、クラッシュは続きます。

前もって感謝します!

4

2 に答える 2

2

この行がありません [self.invocation setSelector:selector];

これはうまくいきます

SEL selector = @selector(callback);
NSMethodSignature *signature = [self methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:self];
[invocation setSelector:selector];
[NSTimer scheduledTimerWithTimeInterval:0.5 invocation:invocation repeats:NO];

- (void)callback
{
    NSLog(@"triggered");
}

出力:

triggered
于 2014-01-08T23:03:18.310 に答える
1

この回答は、署名で初期化することに加えて、呼び出し時に setSelector: を呼び出す必要があることを示唆しているようです。

于 2014-01-08T23:05:45.947 に答える