Sie verwenden Sie die NSTimer
Methode könnte:
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
invocation:(NSInvocation *)invocation
repeats:(BOOL)repeats;
Stattdessen da ein NSInvocation
Objekt ermöglicht es Ihnen, Argumente zu übergeben; ein NSInvocation
Objekt ist, wie der es docs definieren:
ein Objective-C-Nachricht gerenderte statisch, das heißt, es ist eine Aktion in ein Objekt eingeschaltet.
während ein NSTimer
Objekt erstellt einen Selektor erfordert das Format des Verfahrens infrage kommen:
- (void)timerFireMethod:(NSTimer*)theTimer
Ein NSInvocation
ermöglicht, das Ziel gesetzt, den Wähler und die Argumente, die in übergeben:
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];
Wo MyObject
die Klasse ist, dass myMethod:setValue2:
deklariert und implementiert auf - instanceMethodSignatureForSelector:
ist eine Bequemlichkeit functi auf deklariert auf NSObject
, die ein NSMethodSignature
Objekt für Sie zurückgibt, an NSInvocation
übergeben werden.
Auch zu beachten, mit setArgument:atIndex:
, der Indizes für Argumente an der als Wähler Start 2. Aus der docs am Index gesetzt Methode übergeben werden:
Indizes 0 und 1 zeigt die versteckten Argumente Selbst und _cmd jeweils; Sie sollten diese Werte direkt mit den Methoden setTarget: und setSelector: festlegen.Verwenden Sie Indizes 2 und höher für die Argumente, die normalerweise in einer Nachricht übergeben werden.
Das ist eine bessere Antwort als meine. Sie sollten dies tun, um zu vermeiden, dass Ihre Implementierungen mit unnötigen Methoden verschmutzt werden. –
Beachten Sie, dass, wenn 'str1' und' str2' nicht statisch zugewiesen sind, Sie sie verlieren würden. 'NSTimer' ist so dokumentiert, dass '-retainArguments' an sein Aufrufobjekt gesendet wird, aber es würde nicht schaden, wenn Sie' -retainArguments' selbst an das Aufrufobjekt senden. Das Problem besteht darin, die Argumente selbst beizubehalten und dann dem Aufruf zu sagen, sie zu behalten. Behalten Sie die Aufrufargumente nicht selbst! Lassen Sie die Invokation damit umgehen - und lassen Sie den Timer selbst damit umgehen. –
Die Klasse von 'targetInstance' nicht hart codieren, wie beim Abrufen der Methodensignatur. Wenn Sie '+ instanceMethodSignatureForSelector:' wirklich verwenden möchten, können Sie '[[targetInstance class] instanceMethodSignatureForSelector: selector]' verwenden, aber das ist unnötig komplex - fragen Sie das Objekt selbst nach der Methodensignatur mit '[targetInstance methodSignatureForSelector: selector]' . –