Wie genau funktioniert das NSInvocation
? Gibt es eine gute Einführung?
Ich habe speziell Probleme zu verstehen, wie der folgende Code (aus Cocoa Programming für Mac OS X, 3. Ausgabe ) funktioniert, kann dann aber auch die Konzepte unabhängig vom Tutorial-Beispiel anwenden. Der Code:
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index
{
NSLog(@"adding %@ to %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Insert Person"];
// Finally, add person to the array
[employees insertObject:p atIndex:index];
}
- (void)removeObjectFromEmployeesAtIndex:(int)index
{
Person *p = [employees objectAtIndex:index];
NSLog(@"removing %@ from %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] insertObject:p
inEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Delete Person"];
// Finally, remove person from array
[employees removeObjectAtIndex:index];
}
Ich verstehe, was es versucht zu tun. (Übrigens employees
gehört NSArray
zu einer benutzerdefinierten Person
Klasse.)
Als .NET-Typ versuche ich, unbekannte Obj-C- und Cocoa-Konzepte mit ungefähr analogen .NET-Konzepten zu verknüpfen. Ist dies dem Delegatenkonzept von .NET ähnlich, aber untypisiert?
Dies geht aus dem Buch nicht zu 100% hervor, daher suche ich nach einer Ergänzung von echten Cocoa / Obj-C-Experten, wieder mit dem Ziel, das grundlegende Konzept unter dem einfachen (-ish) Beispiel zu verstehen. Ich bin wirklich bestrebt, das Wissen unabhängig anwenden zu können - bis Kapitel 9 hatte ich keine Schwierigkeiten damit. Aber jetzt ...
Danke im Voraus!
quelle
setArgument:atIndex:
, damit die Argumentzuweisung tatsächlich gelesen werden sollte[myInvocation setArgument:&myString atIndex:2]
.Hier ist ein einfaches Beispiel für NSInvocation in Aktion:
Beim Aufruf von -
[self hello:@"Hello" world:@"world"];
- wird die Methode:Am Ende erhalten Sie einen Ausdruck wie folgt:
Natürlich muss das Zielobjekt
self
weiterhin vorhanden sein, damit der NSTimer die NSInvocation an ihn senden kann. Zum Beispiel ein Singleton- Objekt oder ein AppDelegate, das für die Dauer der Anwendung vorhanden ist.AKTUALISIEREN:
Wie oben erwähnt, behält der NSTimer automatisch alle Argumente der NSInvocation bei, wenn Sie eine NSInvocation als Argument an einen NSTimer übergeben.
Wenn Sie eine NSInvocation nicht als Argument an einen NSTimer übergeben und planen, dass sie eine Weile bleibt, müssen Sie ihre
-retainArguments
Methode aufrufen . Andernfalls werden die Argumente möglicherweise freigegeben, bevor der Aufruf aufgerufen wird, was schließlich zum Absturz Ihres Codes führt. So geht's:quelle
invocationWithMethodSignature:
Initialisierers immer noch aufrufen müssensetSelector:
. Es scheint überflüssig, aber ich habe es gerade getestet und es ist notwendig.Sie können versuchen, einfach die Bibliothek hier zu verwenden, die viel schöner ist: http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
quelle
Ich erstelle ein einfaches Beispiel für den Aufruf verschiedener Methodentypen mit NSInvocation.
Ich hatte Probleme beim Aufrufen mehrerer Parameter mit obj_msgSend
https://github.com/clearbrian/NSInvocation_Runtime
quelle