Antwort

6

__bridge ermöglicht es Ihnen (in lockerer Form), zwischen Objective-C und C hin und her zu wechseln, ohne die Speicherverwaltung des Objekts zu beeinträchtigen.

__bridge_transfer ist für die Übertragung eines Objekts von C nach Objective-C mit einer Änderung der Eigentumsrechte des Objekts. Es verringert die CF-Retain-Anzahl und übergibt die Speicherverwaltung an ARC, die schlau genug sein sollte, um das Objekt anschließend in der erforderlichen Weise zu behalten.

__bridge_retained ist im Wesentlichen die Umkehrung von __bridge_transfer, es wird von Objective-C zu C übergeben und die Retain-Anzahl des Objekts in den Prozess inkrementieren. ARC wird aufhören, sich für das Objekt zu interessieren.

1

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.