Sie verwenden kein überbrückendes Gießen mit NSInvocation
.
Denken Sie daran, dass Sie beim Festlegen eines Arguments für eine NSInvocation einen Zeiger auf das Argument übergeben, nicht das Argument selbst; Gießen zu void*
ist nicht erforderlich. NSInvocation wird basierend auf der Methodensignatur, die Sie zum Erstellen des NSInvocation-Objekts verwendet haben, wissen, was mit diesem Zeiger geschehen soll.
Zum Beispiel:
- (NSInvocation*)makeAnInvocation
{
MyObject* anObject = [MyObject new];
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(doIt:)];
[inv setTarget:self];
[inv setSelector:@selector(doIt:)];
[inv setArgument:&anObject atIndex:2]; // Passing the pointer to `anObject`
[inv retainArguments];
return inv;
}
Soweit Speicherverwaltung betrifft: im Allgemeinen, wenn Sie nicht die Methode aufgerufen wird sofort dann sollten Sie die -retainArguments
nennen. Dadurch kann das NSInvocation-Objekt seine Argumente erforderlichenfalls basierend auf der Methodensignatur beibehalten/kopieren. Die Argumente werden dann freigegeben, wenn das NSInvocation-Objekt freigegeben wird.