Quanto segue è la mia categoria Objective-C su NSTimer per eseguire l'attivazione basata su blocchi di NSTimers. Non riesco a vedere nulla di sbagliato in questo, ma quello che sto ottenendo è che il blocco che passo al metodo schedule...
è stato deallocato nonostante io abbia chiamato copy
su di esso.NSTimer con blocco - lo sto facendo bene?
Cosa mi manca?
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
Penso che '(void) timerFired: (NSTimer *) timer' dovrebbe essere un metodo di istanza' -', non un metodo di classe '+'. Lo stesso vale probabilmente per 'scheduledTimerWithTimeInterval', ma ne sono meno sicuro. – dasblinkenlight
Non sarebbe il caso. I metodi pianificati di NSTimer sono metodi di classe. – user1175914
Passare 'self' come target suggerisce fortemente un metodo di istanza. Tutti gli esempi di codice di 'NSTimer' che ho visto usano anche i metodi di istanza per i selettori. – dasblinkenlight