Mit ARC, kann ich nicht mehr gegossen CGColorRef
zu id
. Ich habe gelernt, dass ich eine überbrückte Besetzung machen muss. Laut Clang Docs :
Eine überbrückte Besetzung ist eine Besetzung im C-Stil, die mit einem von drei Schlüsselwörtern versehen ist:
(__bridge T) op
wandelt den Operanden in den Zieltyp umT
. WennT
es sich um einen Zeigertyp für einbehaltbares Objekt handelt,op
muss es einen nicht behaltbaren Zeigertyp haben. WennT
es sich um einen nicht beibehaltenen Zeigertyp handelt, muss op über einen beibehaltenen Objektzeigertyp verfügen. Ansonsten ist die Besetzung schlecht geformt. Es findet keine Eigentumsübertragung statt, und ARC fügt keine Aufbewahrungsvorgänge ein.
(__bridge_retained T) op
wandelt den Operanden, der den Zeigertyp des beibehaltenen Objekts haben muss, in den Zieltyp um, der ein nicht beibehaltener Zeigertyp sein muss. ARC behält den Wert bei, vorbehaltlich der üblichen Optimierungen der lokalen Werte, und der Empfänger ist dafür verantwortlich, diese +1 auszugleichen.
(__bridge_transfer T) op
wandelt den Operanden, der einen nicht beibehaltenen Zeigertyp haben muss, in den Zieltyp um, der ein beibehaltener Objektzeigertyp sein muss. ARC gibt den Wert am Ende des einschließenden vollständigen Ausdrucks frei, vorbehaltlich der üblichen Optimierungen für lokale Werte.Diese Casts sind erforderlich, um Objekte in und außerhalb der ARC-Kontrolle zu übertragen. Weitere Informationen finden Sie im Abschnitt zur Konvertierung von Zeigern für beibehaltene Objekte.
Die Verwendung von a
__bridge_retained
oder__bridge_transfer
cast nur, um ARC davon zu überzeugen, eine unausgeglichene Retention bzw. Freigabe zu emittieren, ist eine schlechte Form.
In welchen Situationen würde ich jeden verwenden?
Hat beispielsweise CAGradientLayer
eine colors
Eigenschaft, die ein Array von CGColorRef
s akzeptiert . Ich vermute, dass ich __brige
hier verwenden sollte, aber genau, warum ich sollte (oder nicht), ist unklar.
Antworten:
Ich stimme zu, dass die Beschreibung verwirrend ist. Da ich sie gerade verstanden habe, werde ich versuchen zusammenzufassen:
(__bridge_transfer <NSType>) op
oder wird alternativCFBridgingRelease(op)
verwendet, um eine Aufbewahrungszahl von a zu verbrauchen,CFTypeRef
während sie an ARC übertragen wird. Dies könnte auch durch dargestellt werdenid someObj = (__bridge <NSType>) op; CFRelease(op);
(__bridge_retained <CFType>) op
oder wird alternativCFBridgingRetain(op)
verwendet, um einNSObject
CF-Land zu übergeben, während es eine +1 Retain-Zählung erhält . Sie sollten a, dasCFTypeRef
Sie auf diese Weise erstellen, genauso behandeln, wie Sie ein Ergebnis von behandeln würdenCFStringCreateCopy()
. Dies könnte auch durch dargestellt werdenCFRetain((__bridge CFType)op); CFTypeRef someTypeRef = (__bridge CFType)op;
__bridge
Wirft nur zwischen Zeigerland und Objektiv-C-Objektland. Wenn Sie nicht geneigt sind, die oben genannten Konvertierungen zu verwenden, verwenden Sie diese.Vielleicht ist das hilfreich. Ich selbst bevorzuge die
CFBridging…
Makros gegenüber den einfachen Darstellern.quelle
Ich habe in der iOS-Dokumentation eine andere Erklärung gefunden, die meiner Meinung nach leichter zu verstehen ist:
__bridge
überträgt einen Zeiger zwischen Objective-C und Core Foundation ohne Eigentumsübertragung.__bridge_retained (CFBridgingRetain)
Wirft einen Objective-C- Zeiger auf einen Core Foundation- Zeiger und überträgt Ihnen auch das Eigentum.Sie sind dafür verantwortlich , CFRelease oder eine verwandte Funktion aufzurufen, um das Eigentum an dem Objekt aufzugeben.
__bridge_transfer (CFBridgingRelease)
Verschiebt einen Nicht-Objective-C- Zeiger auf Objective-C und überträgt auch das Eigentum an ARC.ARC ist dafür verantwortlich, das Eigentum an dem Objekt aufzugeben.
Quelle: Gebührenfreie überbrückte Typen
quelle
In diesem speziellen Fall empfiehlt Apple unter iOS die Verwendung von UIColor und seiner
-CGColor
Methode, um CGColorRef in dascolors
NSArray zurückzugeben. In den Versionshinweisen für den Übergang zu ARC im Abschnitt "Der Compiler behandelt von Cocoa-Methoden zurückgegebene CF-Objekte" wird angegeben, dass die Verwendung einer Methode, mit-CGColor
der ein Core Foundation-Objekt zurückgegeben wird, vom Compiler automatisch ordnungsgemäß behandelt wird.Daher schlagen sie vor, Code wie den folgenden zu verwenden:
Beachten Sie, dass im Beispielcode von Apple ab sofort die oben angegebene (ID-) Besetzung fehlt, die weiterhin erforderlich ist, um einen Compilerfehler zu vermeiden.
quelle