Domanda

Recentemente ho iniziato un nuovo progetto utilizzando Automatic Reference Counting (ARC).
Quando ho assegnato il contenuto di una CALayer:

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

ho ottenuto un errore

La conversione implicita di un non-Objective-C tipo puntatore 'CGImageRef' a 'id' non è consentita con ARC

È sufficiente lanciare il CGImageRef alle pelli id l'errore, ma mi chiedevo se l'arco funziona ancora correttamente, allora?

È stato utile?

Soluzione

Si dovrebbe controllare i video ARC dal WWDC 2011. Essi sono disponibili sul sito degli sviluppatori e aperto tramite iTunes. In particolare:

• Sessione 323 - Introduzione Automatic Reference Counting

• Sessione 322 - Objective-C progressi in profondità

Inoltre, le note di riferimento ARC:

https://developer.apple .com / library / content / releasenotes / ObjectiveC / RN-TransitioningToARC / Introduzione / Introduction.html

Sia le note di riferimento e le video discutono core grafico (et al) e come funzionano con ARC.

In particolare, un'occhiata alla sezione denominata "Gestione Toll-Free Bridging"

In molte applicazioni Cocoa, è necessario utilizzare gli oggetti in stile Fondazione core, sia dal quadro Nucleo Fondazione stessa (come CFArrayRef o CFMutableDictionaryRef) o da strutture che adottano convenzioni fondamentali della Fondazione, come core grafico (è possibile utilizzare i tipi come CGColorSpaceRef e CGGradientRef).

Il compilatore non riesce automaticamente i tempi di vita di Core Oggetti Fondazione; è necessario chiamare CFRetain e CFRelease (o la corrispondente tipo-specifico varianti) come dettato dal Nucleo regole di gestione della memoria Foundation (vedi Programmazione Memory Management Guida per nucleo Foundation).

Se lanci tra oggetti in stile nucleo fondante Objective-C e, si bisogno di dire al compilatore circa la semantica di proprietà dell'oggetto utilizzando un cast (definito in objc / runtime.h) oppure un Core macro-style Foundation (definito in NSObject.h): [...]

Jörg Jacobsen ha una panoramica sommaria buona delle opzioni ponte così: Gestione Bridging Numero verde in un ambiente ARC'ed .

__ bridge_retained (NB .: utilizzarla solo quando lancia da un puntatore a oggetto puntatore tipo C): I (il programmatore) necessario fare riferimento a questo oggetto per qualche tempo nel mondo oscuro di tipo puntatori C, che è opaco a si, ARC. Quindi, per favore, per favore non rilasciare questo oggetto, mentre io ancora bisogno di essa. I (il programmatore) promessa di rilasciare io stesso (al buio mondo) quando ho finito con esso

__ bridge_transfer (NB .: utilizzarla solo quando lancia da un puntatore di tipo C a puntatore oggetto): I (il programmatore) mano a voi, ARC, un oggetto che possiedo e che non sono più interessati a al buio mondo di tipo puntatori C che è opaco a voi. Ogni volta che, ARC, sei fatto con l'oggetto si prega di rilasciarlo da soli, perché si conosce il momento giusto e quindi risparmiare me un po 'di lavoro non hanno a che fare anche io.

__ ponte : ARC, si continua a bilanciare il vostro conserva e rilascia, come continuo a bilanciare miniera nel mondo oscuro di tipo C, che puntatori è…. Ogni volta che ho bisogno di mantenere il un oggetto nel mondo oscuro lo farò conservarlo me stesso e rilasciarlo al momento opportuno. Non ho bisogno di alcun contratto di riserva, ARC.

Altri suggerimenti

Nonostante i riferimenti sottolineato da Steve, credo che il caso si mostra sopra potrebbe essere speciale. Dal Transizione a note di rilascio ARC , prestare attenzione alla sezione "il compilatore Maniglie CF oggetti restituiti dai metodi di cacao":

Il compilatore capisce metodi Objective-C che restituiscono Nucleo tipi di fondazione seguono la storica cacao convenzioni di denominazione (vedi Gestione avanzata della memoria Guida di programmazione). Ad esempio, la compilatore sa che, in iOS, il CGColor restituito dal CGColor Metodo di UIColor non è di proprietà.

L'esempio di codice che forniscono:

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

si basa sul ritorno conosciuto di CGColors da questi metodi (che manca il cast di id che ho aggiunto nel codice di cui sopra, che dovrebbe essere corretto in loro documentazione a breve).

A causa [image CGImage] segue le convenzioni di denominazione, credo che il CGImage verrà colmato correttamente qui. Credo che il cast di id dovrebbe essere tutto ciò che è necessario qui.

Una risposta popolare alla domanda layer.contents = (id)image.CGImage è layer.contents = obj_unretainedObject(image.CGImage).

Lo faccio =(__bridge id)image.CGImage.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top