Jestem nowy w rozwoju iOS i nigdy nie zajmowałem się ręcznym liczeniem odwołań (zatrzymanie, zwolnienie, autorelease). W związku z tym nie mam dobrej wiedzy na temat działania magicznego ARC.Jaki jest poprawny sposób deklarowania właściwości tylko do odczytu dla ios przy użyciu ARC
Myślałem rozumiałem, dopóki nie został zapytany, jaki rodzaj własności (weak
, strong
, assign
, etc.) powinny być podane do właściwością tylko do odczytu, wskazując na obiekcie, takie jak:
@property (readonly,nonatomic) NSString* name;
czytałem tutaj Questions about a readonly @property in ARC, które nie będą się kompilować, chyba że poda się zmienną stanowiącą własność; Właśnie tak stało się określenie ivar podkładową takiego:
@synthesize name = _name;
Teraz rozumiem, że domyślna „kwalifikator życia” zmiennej jest silny, stąd: http://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4
więc wyciąć długą historię short - pośrednio definiuję moją własność jako (readonly,nonatomic,strong)
, ponieważ ivar jest domyślnie zadeklarowane jako .
mam kilka pytań:
Is
strong
poprawny kwalifikator życia w użyciu? Zakładam, że tak jest, w przeciwnym razie obiekt wspierający mojeNSString*
nie byłby nigdzie własnością i dlatego zostałby zwolniony automatycznie (pochodzący z ziemi Java ma to sens, ponieważ wszystkie odniesienia są domyślnie silne).Czy są jakieś inne modyfikatory mające sens w tej sytuacji, takie jak
copy
lubassign
?Czy deklarując właściwość jako
(readonly,nonatomic,strong)
i(readonly,nonatomic)
żadnej różnicy do kodu, który zużywa własnością? na przykład. czy deklarowanie go bez słowa kluczowegostrong
powoduje zapisanie wskaźnika obiektu jako__unsafe_unretained
, gdzie właściwośćstrong
byłaby przechowywana w wskaźniku?
Dzięki!
EDIT
Więc jak rozumiem teraz, obowiązuje tylko do odczytu właściwości:
- Za niedopełnienie NSObject * typy (int, float, void *, etc) używać
(readonly, assign)
. - Dla wskaźników obiektów, użyj
(readonly, strong)
lub(readonly, copy)
- te funkcje działają tak samo dla właściwości tylko do odczytu, ale możesz chcieć semantyki kopiowania, jeśli rozszerzysz/podklasę i ponownie określisz właściwość jakoreadwrite
. - Dla wskaźników obiektów,
(readonly, weak)
ma sens tylko wtedy, gdy zamierzasz przechowywać już słaby wskaźnik w tej właściwości (ten wskaźnik musi być silny gdzie indziej lub obiekt zostanie zwolniony).
Zauważ, że "silne" zakłada się, więc jeśli przedłużyć podany tylko do odczytu '(readonly)' with '(strong)' to zadziała, ale '(copy)' nie będzie. Zamiast tego zobaczysz, że "ARC zabrania syntetyzowania usługi ... z nieokreślonym atrybutem własności lub magazynu". W tym przypadku musisz wyraźnie zaznaczyć w definicji nagłówka '(readwrite, copy)'. To wywołało mnie przez kilka minut. –