Frage

Ich habe kürzlich ein neues Projekt mit automatischer Referenzzählung (ARC) gestartet.
Als ich den Inhalt eines Calayer zugewiesen habe:

UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage

Ich habe einen Fehler bekommen

Implizite Umwandlung eines nicht objektiven C-Zeigertyps 'cgimageRef' in 'ID' wird mit ARC nicht zugelassen

Einfach das wirken CGImageRef zu id Versteckt den Fehler, aber ich habe mich gefragt, ob der Bogen dann noch richtig funktioniert.

War es hilfreich?

Lösung

Sie sollten sich die ARC -Videos von WWDC 2011 wirklich ansehen. Sie sind auf der Entwicklerseite verfügbar und über iTunes geöffnet. Besonders:

• Sitzung 323 - Einführung der automatischen Referenzzählung

• Sitzung 322-Objektiv-C-Fortschritte ausführlich

Auch die ARC -Referenznotizen:

https://developer.apple.com/library/content/releasenotes/objectivec/rn-transitioningtoarc/inTroduction/inTroduction.html

Sowohl die Referenznotizen als auch die Videos diskutieren Kerngrafiken (et al.) Und wie sie mit ARC arbeiten.

Schauen Sie sich den Abschnitt an, der aufgerufen wurde "Verwaltung von gebührenfreiem Überbrücken"

In vielen Cocoa-Anwendungen müssen Sie Objekte im Core Foundation-Stil verwenden, sei es aus dem Kernfundament-Framework selbst (wie CFarrayRef oder CFMutablectionaryRef) oder aus Frameworks, die Kernfundamentkonventionen wie CORS-Grafiken annehmen (Sie können Typen wie CGColorSpaceref und CGgradientRef verwenden ).

Der Compiler verwaltet die Lebensdauer der Kernfundamentobjekte nicht automatisch. Sie müssen CFRetain und CFREase (oder die entsprechenden typspezifischen Varianten) wie die Core Foundation Memory Management-Regeln diktiert (siehe Speichermanagement-Programmierhandbuch für die Kernfundament).

Wenn Sie zwischen Objekten für Objektiv-C und Core Foundation-Stil zugießen, müssen Sie dem Compiler die Eigentümersemantik des Objekts unter Verwendung eines Casts (definiert in OBJC/Laufzeit.H) oder ein Makro im Kernfundament (definiert in OBJC/Laufzeit) mitteilen Nsobject.h): [...

Jörg Jacobsen hat auch einen guten Zusammenfassungsüberblick über die Überbrückungsoptionen: Verwaltung der gebührenfreien Überbrückung in einer bogenförmigen Umgebung.

__bridge_retained (NB: Verwenden Sie es nur, wenn Sie vom Objektzeiger auf C -Zeiger gießen): I (der Programmierer) muss dieses Objekt für einige Zeit in der dunklen Welt von C -Typ Zeiger verweisen, die für Sie undurchsichtig ist, ARC. Bitte veröffentlichen Sie dieses Objekt bitte nicht, während ich es noch brauche. Ich (der Programmierer) verspreche, es selbst (in der dunklen Welt) zu veröffentlichen, wenn ich damit fertig bin

__bridge_transfer (NB: Verwenden Sie es nur, wenn Sie vom C -Typ Zeiger auf Objektzeiger gießen): I (der Programmierer) übergeben Ihnen, Bogen, ein Objekt, das ich besitze und das ich nicht mehr in der dunklen Welt von C -Typ Zeiger interessiere Das ist für dich undurchsichtig. Wenn Sie, Bogen, mit diesem Objekt fertig sind, lassen Sie es bitte selbst frei, denn Sie kennen die richtige Zeit und sparen mir also einige Arbeiten, die es nicht selbst tun müssen.

__Brücke: Bogen, Sie balancieren immer wieder Ihre Rückhaltungen und Veröffentlichungen, während ich meine in der dunklen Welt der C -Typ -Zeiger ausbalanciere, die…. Wann immer ich mich an einem Objekt in der dunklen Welt festhalten muss, werde ich es selbst behalten und gegebenenfalls loslassen. Ich brauche keinen zusätzlichen Vertrag mit Ihnen, Bogen.

Andere Tipps

Trotz der Referenzen von Steve glaube ich, dass der Fall, den Sie oben zeigen, etwas Besonderes sein könnte. Von dem Übergang zu ARC -Versionsnotizen, achten Sie auf den Abschnitt "Der Compiler verarbeitet CF -Objekte, die aus Kakao -Methoden zurückgegeben werden":

Der Compiler versteht objektive C-Methoden, die die Kernfundament-Typen zurückgeben, die den historischen Kakao-Namenskonventionen folgen (siehe Programmierhandbuch für erweiterte Speicherverwaltung). Zum Beispiel weiß der Compiler, dass in iOS der CGColor, der von der CGColor -Methode von UIColor zurückgegeben wird, nicht im Besitz ist.

Das Code -Beispiel, das sie angeben:

gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];

stützt sich auf die bekannte Rückgabe von CGColors aus diesen Methoden (ihnen fehlt die Besetzung zu ID, die ich im obigen Code hinzugefügt habe, was in ihrer Dokumentation bald korrigiert werden sollte).

Da [image CGImage] Nach den Namenskonventionen glaube ich, dass die CGImage hier richtig überbrückt wird. Ich denke, dass Ihre Besetzung für den Ausweis alles sein sollte, was Sie hier brauchen.

Eine beliebte Antwort auf layer.contents = (id)image.CGImage die Frage ist layer.contents = obj_unretainedObject(image.CGImage).

Ich tue =(__bridge id)image.CGImage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top