Il file di intestazione generato da Swift per Obj-C sembra presupporre che ARC venga utilizzato nel codice Obj-C. A seconda della versione di Xcode e delle impostazioni di compilazione, è possibile che venga attivato un avviso che avverte l'utente quando una proprietà è implicitamente una proprietà assign
, che è solo il caso in codice non ARC come nel codice ARC, le proprietà sono implicitamente strong
(che è esattamente uguale a retain
in codice non ARC). Con questo avviso abilitato, riceverai questo avviso ogni volta che importi l'intestazione generata in un file .m che non è ARC e Swift non ha impostato un attributo di memoria per quella proprietà.
Ma questo avviso non significa che il codice compilato non funzionerà correttamente in seguito. Nonostante il fatto che il compilatore ritiene che questa proprietà è solo assign
, lo farà di sicuro non essere assign
proprietà come Swift non possono nemmeno essere assign
, possono essere strong
o possono essere weak
(weak
non è lo stesso di assign
! weak
-properties diventano nil
quando l'oggetto muore, assign
- le proprietà diventano puntatori penzolanti e puntano ancora all'indirizzo in cui l'oggetto viveva). La cosa peggiore che ciò può causare, nonostante l'avviso, è un risultato errato dell'analizzatore di codice statico in quanto l'analizzatore potrebbe anche avvertire in che modo questa proprietà assign
può infrangere il codice e ancora, l'analizzatore è errato in quanto la proprietà semplice non è assign
in la realtà.
Per rimediare, l'unica cosa che è stato richiesto è quello di non fare affidamento su una proprietà di essere niente di default e sempre etichettare correttamente tutte le proprietà come strong
, che funziona anche nel codice non-ARC (strong
e retain
sono solo sinonimi di il compilatore tratta entrambi esattamente la stessa cosa, quindi entrambi possono essere utilizzati in codice non ARC). La cosa divertente è abbastanza spesso che è esattamente ciò che Swift fa. Ho tonnellate di proprietà strong
nella mia intestazione generata ma a quanto pare ci sono situazioni in cui Swift non lo farà (forse questo è in realtà un bug Swift).
E facile lavoro-a-rotonda per questo problema è quello di disabilitare solo l'avviso durante l'importazione l'intestazione generato, che può essere fatto come segue:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-property-no-attribute"
#import "xxx-Swift.h"
#pragma clang diagnostic pop
proprio pack che in un altro file di intestazione, per esempio My-xxx-Swift.h
e quindi importa solo My-xxx-Swift.h
ovunque nel tuo codice.
Non lo disabiliterò per l'intero progetto (ad esempio nelle impostazioni di Xcode build) come di solito questo avvertimento è abbastanza significativo e può aiutare a prevenire bug terribili quando si mescola ARC e codice non ARC, come forse una proprietà non lo fa Si ha davvero l'attributo di archiviazione che si ritiene abbia e quindi quando si mixano ARC e non ARC, si consiglia vivamente di non fare mai affidamento su attributi impliciti e di rendere sempre lo storage esplicito.
Non ho davvero idea del perché non stai ancora utilizzando ARC. Ho capito che è un codice legacy, ma il codice legacy dovrebbe essere aggiornato ... –
l'era di "pre-ARC" chiamata 'MRC', forse è bello sapere cosa stai usando. – holex
@LordZsolt Per evitare di introdurre inutilmente bug di gestione della memoria in una base di codice di grandi dimensioni che è stata ben testata nell'ambito del regime di gestione della memoria pre-ARC. – Bill