Sono nuovo allo sviluppo di iOS in generale e non ho mai trattato il conteggio dei riferimenti manuale (mantenimento, rilascio, autorelease). In quanto tale, non ho una buona comprensione di ciò che la magia ARC sta eseguendo.Qual è il modo corretto per dichiarare una proprietà readonly per iOS utilizzando ARC
ho pensato ho capito fino a quando mi è stato chiesto che tipo di proprietà (weak
, strong
, assign
, ecc) dovrebbe essere dato a una proprietà di sola lettura che punta ad un oggetto, come ad esempio:
@property (readonly,nonatomic) NSString* name;
ho letto qui Questions about a readonly @property in ARC che lo smantellamento dello strong
/weak
non verrà effettivamente compilato a meno che non venga specificata una variabile di supporto quando si utilizza la proprietà @synthesize
; Ho solo così è capitato di essere specificando un Ivar supporto come questo:
@synthesize name = _name;
Ora capisco che il 'qualificatore vita' di default di una variabile è forte, da qui: http://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4
Quindi, per farla breve - Sto definendo indirettamente la mia proprietà come (readonly,nonatomic,strong)
come ivar _name
implicitamente dichiarato come __strong
.
ho alcune domande:
E`
strong
il qualificatore vita corretto da usare? Presumo che lo sia, altrimenti l'oggetto che supporta il mioNSString*
non sarebbe di proprietà da nessuna parte e verrebbe quindi liberato automaticamente (proveniente da Java, questo ha senso in quanto tutti i riferimenti sono forti per impostazione predefinita).Esistono altri modificatori che hanno senso in questa situazione, ad esempio
copy
oassign
?Vuol dichiarando la proprietà come
(readonly,nonatomic,strong)
e(readonly,nonatomic)
fare alcuna differenza per il codice che consuma la proprietà? per esempio. dichiararlo senza la parola chiavestrong
causa il puntatore all'oggetto da memorizzare come__unsafe_unretained
dove la proprietàstrong
si memorizzerebbe in un puntatore__strong
?
Grazie!
EDIT
Quindi se ho capito ora vale quanto segue a sola lettura proprietà:
- Per i non-NSObject * tipi (int, float, void *, ecc) utilizzare
(readonly, assign)
. - Per i puntatori di oggetti, utilizzare
(readonly, strong)
o(readonly, copy)
- questi funzionano allo stesso modo per le proprietà di sola lettura ma è possibile che si desideri la semantica della copia se si estende/sottoclasse e si dichiara la proprietà comereadwrite
. - Per i puntatori di oggetti,
(readonly, weak)
ha senso solo se si sta memorizzando un puntatore già debole in quella proprietà (quel puntatore deve essere forte altrove o l'oggetto sarà deallocato).
nota che "forte" è implicito, quindi se si estende un readonly specificato '(readonly)' con '(strong)' funzionerà, ma '(copy)' non lo farà. Invece vedresti "ARC vieta di sintetizzare una proprietà ... con proprietà non specificate o attributo di memorizzazione". In questo caso è necessario essere espliciti nella definizione dell'intestazione '(readwrite, copy)'. Questo mi ha fatto inciampare per qualche minuto. –