2015-01-06 12 views
5

Se ho una proprietà come questa:La gestione della memoria di una proprietà può cambiare se viene ridefinita in un'estensione di classe?

//test.h 

@interface test 
@property (nonatomic, readonly, weak) NSObject x; 
@end 

ridefinito nel file di implementazione da lettura/scrittura:

// test.m 
@interface test() 
@property (nonatomic, readwrite) NSObject x; 
@end 

ho usato debole .h, ma non dissi nulla nell'estensione, la proprietà manterrà l'identificatore "debole" o cambierà in "forte"?

Le parole chiave strong/assign/weak verranno sovrascritte quando la proprietà viene ridefinita?

+0

Come pratica comune, si specifica sempre l'attributo 'strong/weak/assign' della proprietà nell'estensione di classe. Non è necessario nella dichiarazione pubblica di sola lettura. – rmaddy

+0

@rmaddy - Dichiarare solo 'readonly' nel' .h' e 'readwrite, weak' nell'estensione di classe nel' .m' restituisce "La dichiarazione di proprietà primaria è implicitamente forte mentre la redeclaration nell'estensione di classe è debole" in Xcode 5.1 .1. Comunque includere 'strong' o' assign' nell'estensione non aumenta l'ira del compilatore. Un compilatore successivo ha cambiato questo? – CRD

+0

@CRD Hmmm. Immagino di non averlo fatto con proprietà 'weak'. Buono a sapersi. – rmaddy

risposta

5

Un semplice test con Xcode 5.1.1 mostra l'attributo weak mantenuto. Lo stesso vale per gli attributi assign e strong - è possibile specificarli nello .h e ometterli nello .m, se li si include nello .m i due devono corrispondere.

Detto questo, non so se questo è documentato ovunque. Ma poi la semantica dell'Obiettivo-C non è formalmente definita da nessuna parte. Quindi usa a tuo rischio.

Raccomandazione: basta ripeterlo.

+0

come si controlla se l'attributo è impostato? Sto cercando di trovare un modo per controllare queste cose. Grazie! – Wingzero

+0

In fase di compilazione basta leggere '.h'; per la ricerca runtime la funzione 'property_getAttributes' nella documentazione. – CRD

Problemi correlati