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.