È potrebbe utilizzare il metodo NSTimer
:
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
invocation:(NSInvocation *)invocation
repeats:(BOOL)repeats;
Invece, dal momento che un oggetto NSInvocation
vi permetterà di passare argomenti; un oggetto NSInvocation
è, come docs definiscono:
un Objective-C messaggio reso statico, cioè, si tratta di un'azione trasformato in un oggetto.
Mentre creazione di un oggetto NSTimer
utilizzando un selettore richiede il formato del metodo essere:
- (void)timerFireMethod:(NSTimer*)theTimer
Un NSInvocation
consente di impostare la destinazione, il selettore, e gli argomenti che vengono passati in:
SEL selector = @selector(myMethod:setValue2:);
NSMethodSignature *signature = [MyObject instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:selector];
NSString *str1 = @"someString";
NSString *str2 = @"someOtherString";
//The invocation object must retain its arguments
[str1 retain];
[str2 retain];
//Set the arguments
[invocation setTarget:targetInstance];
[invocation setArgument:&str1 atIndex:2];
[invocation setArgument:&str2 atIndex:3];
[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:invocation repeats:YES];
Dove MyObject
è la classe che viene dichiarata myMethod:setValue2:
e attuate sulla - instanceMethodSignatureForSelector:
è un functi convenienza on dichiarato su NSObject
che restituisce per te un oggetto NSMethodSignature
da passare a NSInvocation
.
Inoltre, da notare, con setArgument:atIndex:
, gli indici di argomenti da passare al metodo impostare come inizio selettore all'indice 2. Dalla documentazione:
indici 0 e 1 indicano gli argomenti nascosti auto e _cmd, rispettivamente; dovresti impostare questi valori direttamente con setTarget: e setSelector: metodi.Utilizzare gli indici 2 e maggiori per gli argomenti normalmente passati in un messaggio.
fonte
2009-08-28 23:02:01
Questa è una risposta migliore della mia. Dovresti farlo per evitare di inquinare le tue implementazioni con metodi non necessari. –
Si noti che, se 'str1' e' str2' non sono stati assegnati in modo statico, si perderebbero loro. 'NSTimer' è documentato come l'invio di' -retainArguments' al suo oggetto di invocazione, ma non sarebbe male per voi di inviare '-retainArguments' all'oggetto di invocazione da soli. Il problema è mantenere gli argomenti da soli, quindi dire l'invocazione per mantenerli, pure. Non conservare autonomamente gli argomenti di chiamata! Lascia che l'invocazione lo gestisca - e, qui, lascia che il timer lo gestisca da solo. –
Non hardcode la classe di 'targetInstance', come è stato fatto nel recuperare la firma del metodo. Se si volesse veramente usare '+ instanceMethodSignatureForSelector:', si potrebbe usare '[[classe targetInstance instanceMethodSignatureForSelector: selector]', ma inutilmente complesso - basta chiedere all'oggetto stesso la firma del metodo usando '[targetInstance methodSignatureForSelector: selector]' . –