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).
fonte
2012-09-05 16:03:08
Grazie mille! Ci proverò adesso! – user1574429
Non è necessario copiarlo. Un cast di bridge senza pedaggio è letteralmente solo 'NSArray * myNsArray = (NSArray *) myCfArray;' – jjv360
Che funziona solo per codice non ARC. –