Ich bin ein iOS-Neuling. Ich habe eine Auswahlmethode wie folgt:
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
Ich versuche so etwas umzusetzen -
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Aber das gibt mir einen Fehler zu sagen -
Instance method -performSelector:withObject:withObject:afterDelay: not found
Irgendwelche Ideen, was mir fehlt?
iphone
ios
selector
performselector
Suchi
quelle
quelle
invoke
anzurufen:[inv performSelector:@selector(invoke) withObject:nil afterDelay:1];
Ich muss zustimmen, dass dies eine großartige Lösung ist. Viel Spaß beim Codieren!Weil es keine
[NSObject performSelector:withObject:withObject:afterDelay:]
Methode gibt.Sie müssen die Daten, die Sie senden möchten, in ein einzelnes Objective C-Objekt (z. B. ein NSArray, ein NSDictionary, einen benutzerdefinierten Objective C-Typ) einkapseln und dann die
[NSObject performSelector:withObject:afterDelay:]
bekannte und beliebte Methode durchlaufen .Beispielsweise:
quelle
NSNumber * whatToDoNumber = [NSNumber numberWithBool: doThis];
") und geben Sie es als den einen Parameter @virata weiter.Sie können Ihre Parameter in ein Objekt packen und eine Hilfsmethode verwenden, um Ihre ursprüngliche Methode aufzurufen, wie Michael und andere jetzt vorgeschlagen haben.
Eine weitere Option ist dispatch_after, bei der ein Block zu einem bestimmten Zeitpunkt in die Warteschlange gestellt wird.
Oder, wie Sie bereits festgestellt haben, wenn Sie die Verzögerung nicht benötigen, können Sie sie einfach verwenden
- performSelector:withObject:withObject:
quelle
__weak
Ihrem vorgetäuschten Timer nur ein schwaches Glied zu sich selbst zurückgeben können, damit Sie den Lebenszyklus Ihres Objekts nicht künstlich verlängern und z. B. wenn Ihr performSelector: afterDelay: etwas wie Tail bewirkt Rekursion (wenn auch ohne Rekursion), dann wird der Aufbewahrungszyklus aufgelöst.Die einfachste Option besteht darin, Ihre Methode so zu ändern, dass ein einzelner Parameter verwendet wird, der beide Argumente enthält, z. B. ein
NSArray
oderNSDictionary
(oder eine zweite Methode hinzuzufügen, die einen einzelnen Parameter verwendet, ihn entpackt und die erste Methode aufruft und dann die zweite Methode für a aufruft verzögern).Zum Beispiel könnten Sie so etwas haben wie:
Und um es dann zu nennen, können Sie Folgendes tun:
quelle
NSDictionary
verliert die Änderung der zu verwendenden Methode auch die Typensicherheit. Nicht ideal.performSelector:
(oderNSInvocation
) zu verwenden. Wenn dies ein Problem darstellt, ist es wahrscheinlich die beste Option, die GCD zu durchlaufen.und nenne es mit:
quelle
Hier finden Sie alle Arten der bereitgestellten performSelector: -Methoden:
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html
Es gibt eine Reihe von Variationen, aber es gibt keine Version, die mehrere Objekte sowie eine Verzögerung akzeptiert. Sie müssen Ihre Argumente stattdessen in einem NSArray oder NSDictionary zusammenfassen.
quelle
Ich mag den zu komplexen NSInvocation-Weg nicht. Lassen Sie es uns einfach und sauber halten:
quelle
Ich habe nur ein bisschen geschwatzt und musste die ursprüngliche Methode aufrufen. Ich habe ein Protokoll erstellt und mein Objekt darauf geworfen. Eine andere Möglichkeit besteht darin, die Methode in einer Kategorie zu definieren, muss jedoch eine Warnung unterdrücken (#pragma clang Diagnose ignoriert "-Wincomplete-Implementierung").
quelle
Eine einfache und wiederverwendbare Möglichkeit ist das Erweitern
NSObject
und Implementierenetwas wie:
quelle
Ich würde einfach ein benutzerdefiniertes Objekt erstellen, das alle meine Parameter als Eigenschaften enthält, und dann dieses einzelne Objekt als Parameter verwenden
quelle