NSTimer mit block — mache ich es richtig?

Folgendes ist mein Ziel-die C-Kategorie auf NSTimer zu tun block-basierte abfeuern von NSTimers. Ich kann nicht sehen, nichts falsch mit ihm, aber was ich damit sagen will ist, dass der block ich pass in die schedule... Methode freigegeben wird, ist trotz meiner Berufung copy.

Was bin ich?

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
Ich denke (void)timerFired:(NSTimer *)timer sollte eine Instanz-Methode -, nicht eine Methode der Klasse +. Das gleiche trifft wahrscheinlich auch auf scheduledTimerWithTimeInterval, aber ich bin weniger sicher.
Das wäre nicht der Fall. NSTimer geplanten Methoden sind Klassenmethoden.
Vorbei self als Ziel stark darauf hin, eine Instanz-Methode. Alle code-Beispiele des NSTimer ich das gesehen habe mit Instanz-Methoden für die Selektoren als auch.
Class-Objekte sind first-class Objekte in Objective-C. Keinen Grund, warum "selbst" nicht-Klasse. Dass Sie nicht gesehen haben, es bedeutet nicht, es wird nicht unterstützt. Siehe hier.
Einfach nur neugierig, wenn Sie etwas anderes als ein block (sagen wir, eine Instanz des eigenen Objekts mit dealloc) für userInfo hat Ihr dealloc aufgerufen wird?

InformationsquelleAutor user1175914 | 2012-02-23

Schreibe einen Kommentar