2014-08-28 6 views
6

È possibile scrivere app utilizzando la gestione manuale della memoria (invece del conteggio automatico dei riferimenti) utilizzando SWIFT?Swift senza ARC

Posso chiamare retain e release utilizzando Swift?

+0

Dopo i commenti nella mia risposta di seguito e la risposta @newacct, mi chiedo ora: vuoi evitare ARC su * alcuni * oggetti nel tuo progetto, o disattivare ARC per l'intero progetto? Potrebbe renderlo esplicito nella tua domanda? – Antonio

risposta

10

È possibile chiamare retain e release su Unmanaged<T> valori. Unmanaged sono fondamentalmente puntatori di oggetti che non sono gestiti da ARC. Ma dovresti convertire in puntatori gestiti per interagire con le API Cocoa.

Ma non si vorrebbe farlo se non in circostanze eccezionali. E un progetto che non è convertito in ARC non è una situazione del genere.

1

Nota 29 agosto 2014 - La mia risposta qui sotto non è corretto, è possibile, guarda @newacct risposta

No non si può. Maggiori informazioni su Automatic Reference Counting.

è necessario avere una buona ragione per non voler ARC

+3

senza un vero motivo - solo cuorious – YogevSitton

+1

Ah ok. Ho paura di voler fare qualcosa di strano :) – Antonio

+0

Sto lavorando a un progetto non ARC e mi chiedevo se posso aggiungere codice Swift senza trasformarlo in un progetto ARC. – YogevSitton

0

Attualmente non esiste un modo per disattivare ARC per swift nel modo che è possibile con objc (ad esempio per file con un flag di compilazione). Come altri hanno sottolineato, ci sono le API "Unmanaged" e "UnsafeMutablePointer", progettate per l'interazione con le API C, che consentono di aggirare l'ARC in alcuni casi. Tuttavia queste API sono ingombranti e richiedono di apportare modifiche sostanziali al codice (ad esempio per l'interazione con gli array).

Gli utenti di Swift in genere desiderano che si riscriva il codice per utilizzare le strutture ed evitare i problemi di riferimento laddove possibile. Ma questo rende doloroso il porting del codice esistente.

Ci sono alcuni suggerimenti nel mio altro post riguardante le prestazioni ARC qui: Swift Dictionary slow even with optimizations: doing uncessary retain/release? ma nessuno è molto soddisfacente.

Sono arrivato al punto di scrivere codice per post-elaborare il codice oggetto mach-O compilato e rimuovere le chiamate swift_retain/release di ARC da alcune classi come esperimento. Ma spero davvero che ora che Swift sia open source possiamo solo modificarlo per renderlo più flessibile in futuro.