2012-03-07 11 views
15

Ho appena convertito la mia app in ARC e, sebbene si sviluppi bene, ricevo 600 avvisi, tutti relativi alle mie proprietà. Quali:App convertita in ARC, ora ricevendo avvisi sulle mie proprietà

attributo proprietà Default 'assegnare' non è appropriato per non gc oggetto

n 'assegnazione', 'mantenere' o attributo 'copia' è specificata - 'assegnazione' è assunta

Screenshot for warning

Dopo Xcode convertito il mio codice, qui è quello che le mie proprietà assomigliano:

@property (nonatomic) EKEventStore *eventStore; 
@property (nonatomic) EKCalendar *defaultCalendar; 
@property (nonatomic) UIActionSheet *currentActionSheet; 
@property (nonatomic) UILabel *noEventLabel; 

Qualcuno ha parlato della necessità di aggiungere strong a tutti questi. È questo il caso? Xcode ha dimenticato di aggiungere qualcosa?

+0

Che aspetto avevano le proprietà prima della conversione? Non ho ancora usato ARC, ma mi aspetterei di vedere (non anatomico, conservare) o (non anatomico, assegnare) ecc. –

+0

Sì, prima che fossero (non anatomici, conservare) –

risposta

18

ARC ha ragione. Non è possibile avere no qualiferico di gestione della memoria; è deve dire assegnare, mantenere (o forte che è la stessa cosa), o debole.

In precedenza, assegnare era l'impostazione predefinita. Ma probabilmente non è quello che vuoi, perché è la peggiore opzione possibile - è un riferimento debole non ARC vecchio stile. O vuoi un riferimento debole all'ARC intelligente (passa a zero quando l'oggetto scompare) o un riferimento forte (gestito dalla memoria per te da ARC).

+0

Ok, dato che erano (non anatomici, conservati) Suppongo che vorrei ora (non anatomico, forte), è corretto? Perché Xcode non l'ha fatto per me ?! –

+0

Perché se una proprietà è forte o debole dipende dallo sviluppatore.Uno degli obiettivi di Apple per ARC era che fosse affidabile al 100%, quindi non assumono in un modo o nell'altro (l'ipotesi dell'assegnazione era prima di ARC, quindi è diversa). –

+0

@NicHubbard: in realtà sembra un potenziale bug. Se tu avevi 'retain' before, allora presumibilmente vuoi' strong'. Potresti voler [segnalare un bug report] (http://bugreport.apple.com). –

7

Siamo spiacenti di aggiungere una seconda risposta, ma questo risulta essere più complesso di quanto pensassi. Si scopre che stai vedendo un comportamento modificato (forse un bug?) In Xcode 4.3.

in Xcode 4.2, il convertitore avrebbe offerto di cambiare (nonatomic, retain) a (nonatomic, strong). Ma in Xcode 4.3, offre di cambiarlo in (nonatomic); Immagino che se non lo vuoi, cambiare retain a strong dipende da te prima della conversione.

D'altra parte, in Xcode 4.2, (nonatomic) da solo era assolutamente illegale per una proprietà sintetizzata; in Xcode 4.3, non lo è: si ottiene un avviso, ma si presume che si intenda assign e quindi non è illegale.

Quindi c'è stato un cambiamento nel modo in cui ARC funziona in LLVM 3.1 e un cambiamento di accompagnamento nel convertitore ARC Xcode 4.3.

+0

Grazie per averlo chiarito. –

+2

Questo non ha senso. Il valore predefinito ora è FORTE, non assegnato. Quindi (non anatomico) da solo dovrebbe significare (non anatomico, forte). L'avvertimento è quello sbagliato. –

+0

E questo, signore e signori, è per questo che il progetto posso ancora ** NON ** convertire con successo in ARC sulla mia macchina principale Xcode 4.2, che ho trasferito via LAN su un altro Mac con Lion/Xcode 4.3 per migrare e poi indietro, non costruirà. Penso che siamo tutti d'accordo sul fatto che ARC sia ancora in ** beta **? –

3

Penso che le risposte siano sbagliate.

In Xcode 4.3 viene visualizzato un avviso. Tuttavia, presuppone che tu intenda RETAIN. Mantieni è il nuovo valore predefinito per i codici in ARC. Qualcuno mi ha detto che xcode sta sistemando questo.

Per favore correggimi se sbaglio.

+1

Questo è corretto. Più precisamente, le proprietà dell'oggetto obj-c sono forti per impostazione predefinita. –

Problemi correlati