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
Das wäre nicht der Fall. NSTimer geplanten Methoden sind Klassenmethoden.
Vorbei
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
(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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich diesen code immer bei
http://orion98mc.blogspot.ca/2012/08/objective-c-blocks-for-fun.html
Tolle Arbeit
es ist genial!!!
InformationsquelleAutor Mc.Stever
Haben Sie ein Projekt auf github, die nicht den job !
Cocoapod BlocksKit, erlauben Sie Blockify eine Reihe von Klassen...
InformationsquelleAutor Nicolas Henin
Hier ist der Swift-version von Mc.Stever Antwort:
InformationsquelleAutor friedbunny
Was du bist fehlt, ist, dass, wenn der block, den Sie sind, übergeben Sie in auf dem Stapel ist, dann
copy
wird genau das tun, was der name sagt — es werde erstellen Sie eine kopieren der block über auf dem heap. Man würde daher erwarten, dass keine änderung im Verhalten, das Sie übergeben, und niemand neues ist, das behalten Sie. Die Kopie wird am Leben bleiben, während die Originale freigegeben wird.(beiseite: wenn Sie nicht mit dem BOGEN werden Sie auch einen autorelease der Kopie; Sie sind gedacht, um passieren eine nicht-Besitz-Referenz als
userInfo:
. Ansonsten wird die Kopie niemals aufgehoben)InformationsquelleAutor Tommy
versuchen, diese
Selektoren definitiv support-Klasse Methoden. Ihr problem ist block bekommen freigegeben, bevor der timer ausgelöst, aber ich kann nicht sehen, warum dies geschieht. was ist die Fehlermeldung?
InformationsquelleAutor Bryan Chen