20

ho creato un @property di UIColor,ARC proibisce di sintetizzare una proprietà con la proprietà non specificato o la conservazione

@property (nonatomic) UIColor *color; 

e poi ho cercato di sintetizzare:

@synthesize color = _color; 

ma ricevo un errore:

ARC forbids synthesizing a property of Objective-C object with unspecified ownership or storage attribute

Che cosa significa?

Tutto quello che sto cercando di fare è creare una proprietà per un oggetto UIColor che cambia colore.

+0

Potrebbe essere necessario fornire una dichiarazione e un'implementazione complete della classe poiché ciò sembra valido. Lo spazio di archiviazione predefinito nelle proprietà è forte, a meno che non si tratti di un blocco in cui è necessario specificarlo manualmente come 'copia'. –

risposta

37

Modifica della dichiarazione di proprietà per:

@property (nonatomic,strong) UIColor *color;

in modo che ARC sa che dovrebbe essere mantenuta. Questo sarebbe stato compilato senza strong prima di ARC, ma sarebbe pericoloso poiché il valore predefinito era assign e il colore sarebbe stato rilasciato a meno che non fosse conservato altrove.

Consiglio vivamente il video WWDC2011 su ARC.

+8

Questo non è richiesto a meno che la proprietà non sia un blocco, nel qual caso deve essere esplicitamente menzionato come 'copia'. Quindi il problema è qualcos'altro. –

+0

@VikramRao, questa domanda ha 2,5 anni. Nel momento in cui è stato chiesto, sono state richieste proprietà sintetizzate per dichiarare la classe di memoria e l'impostazione predefinita era 'assign' – Brian

+1

@Brian Ad ogni modo, sarebbe opportuno aggiornare la risposta accettata, poiché le persone potrebbero vederlo tramite google. Questi sviluppatori, che non lo sanno, potrebbero pensare di doverli scrivere esplicitamente. Per ora questo errore è mostrato principalmente con i blocchi, che devono essere 'copia'. Gli oggetti sono di default 'strong', tipi primitivi come' BOOL', 'NSInteger' etc -' assign' ed è improbabile che qualcuno possa vedere questo errore con oggetti/tipi primitivi. – Vive

4

È necessario specificare la memoria strong o weak nella dichiarazione di proprietà (accanto a nonatomic).

+0

È qualcosa che devo fare sempre per i puntatori agli oggetti? –

+1

Sì, è necessario specificare come devono essere gestiti dalla memoria. – JoePasq

+1

@WilliamSham non è necessario farlo per tutti i puntatori, solo per le proprietà. I puntatori nello scope locale sono riferimenti forti per impostazione predefinita, ma è possibile istruire ARC per trattare un puntatore come riferimento debole usando __weak. – Kekoa

Problemi correlati