Mit ARC, kann ich nicht mehr gegossen CGColorRefzu 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) opwandelt den Operanden in den Zieltyp umT. WennTes sich um einen Zeigertyp für einbehaltbares Objekt handelt,opmuss es einen nicht behaltbaren Zeigertyp haben. WennTes 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) opwandelt 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) opwandelt 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_retainedoder__bridge_transfercast 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 CAGradientLayereine colorsEigenschaft, die ein Array von CGColorRefs akzeptiert . Ich vermute, dass ich __brigehier verwenden sollte, aber genau, warum ich sollte (oder nicht), ist unklar.