2012-09-05 5 views
9

Eventuali duplicati:
How to make an CFArrayRef to an NSMutableArrayCome convertire CFArrayRef in NSArray?

So che c'è così tanti informazioni su questa domanda, ma ogni singolo risposte sono "questo è facile che si può fare lanciato come a ponte numero verde. . ", e quindi non vi è alcuna menzione del codice sorgente effettivo. Conosco il significato di un ponte e un cast senza pedaggio. Voglio sapere il codice sorgente esatto "Come convertire CFArrayRef in NSArray?" . Chiunque per favore !!!!!!

risposta

5

Si dovrebbe essere in grado di lanciare è:

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

Grazie mille! Ci proverò adesso! – user1574429

+1

Non è necessario copiarlo. Un cast di bridge senza pedaggio è letteralmente solo 'NSArray * myNsArray = (NSArray *) myCfArray;' – jjv360

+0

Che funziona solo per codice non ARC. –

37

Beh, prima bisogna sapere se si utilizza ARC o no, perché le regole cambiano un po '. Successivamente, è necessario sapere che cosa si desidera effettivamente fare con il cast. Vuoi semplicemente utilizzare il valore o trasferire la proprietà?

Assumero ARC, perché, IMO, tutto il nuovo codice dovrebbe davvero usare ARC (e ARC è dove i problemi di trasmissione sono più diffusi).

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

Il codice sopra getta il riferimento a un CF NSArray* che può essere utilizzato nel contesto attuale. Nessun trasferimento di proprietà è avvenuto. someArrayRef detiene ancora il suo riferimento e si deve comunque rilasciare manualmente someArrayRef o si verificherà la perdita.

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

In questo codice, non si ottiene solo un cast, ma un trasferimento di proprietà. someArrayRef ora non contiene più il riferimento, quindi non ha bisogno di essere rilasciato manualmente. Invece, quando si rilascia array, l'oggetto sarà dealloc (non assumendo altri riferimenti in altri posti).

+0

Sembra che CFBridgingRelease sia la strada da percorrere nell'ambiente ARC. Trasferisci sempre su NS ... e utilizza CFBridgingRelease –