NSTimer avec bloc — suis-je en train de faire?

Ce qui suit est mon Objectif C de la catégorie sur NSTimer faire basé sur des blocs de tir de NSTimers. Je ne vois rien de mal à cela, mais ce que je reçois est que le bloc je passe à la schedule... méthode est en train d'être libéré en dépit de m'appeler copy.

Ce qui me manque?

typedef void(^NSTimerFiredBlock)(NSTimer *timer);

@implementation NSTimer (MyExtension)

+ (void)timerFired:(NSTimer *)timer 
{
    NSTimerFiredBlock blk = timer.userInfo;
    if (blk != nil) {
        blk(timer);
    }
}

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds 
                                    repeats:(BOOL)repeats 
                                   callback:(NSTimerFiredBlock)blk 
{
    return [NSTimer scheduledTimerWithTimeInterval:seconds
                                            target:self
                                          selector:@selector(timerFired:)
                                          userInfo:[blk copy]
                                           repeats:repeats];
}

@end
Je pense que (void)timerFired:(NSTimer *)timer devrait être une méthode d'instance -, pas une méthode de la classe +. La même chose s'applique probablement à scheduledTimerWithTimeInterval, mais je suis moins sûr que la.
Qui ne serait pas le cas. NSTimer prévue méthodes sont des méthodes de classe.
En passant self que la cible suggère fortement une méthode d'instance. Tous les exemples de code de NSTimer que j'ai vu l'utilisation de méthodes d'instance pour les sélecteurs.
Les objets de la classe sont des objets de première classe en Objective-C. Aucune raison de "soi" ne peut pas pointer vers une classe. Que vous n'avez pas vu ne signifie pas qu'il n'est pas pris en charge. Voir ici.
Juste par curiosité, si vous passez à autre chose qu'à un bloc (par exemple, une instance de votre propre objet avec dealloc) pour userInfo, est-ce que votre dealloc est appelé?

OriginalL'auteur user1175914 | 2012-02-23