JeremyP ha fatto un buon punto. Poiché la sintassi dell'invocazione setter implica sempre "self", il cui tipo è determinato in fase di runtime, quindi un'istanza di sottoclasse può chiamare la sua versione sovrascritta di setter, se "self" è veramente un oggetto sottoclasse ...
Tuttavia, lì sono alcuni casi in cui è necessario utilizzare il setter in un inizializzatore. Questo è quando la variabile di istanza viene dichiarata all'interno di una superclasse; NON puoi accedere direttamente alla variabile di istanza, quindi devi usare il setter.
Un'altra situazione è quando la proprietà utilizza l'inizializzazione pigra. In questo caso, devi passare attraverso il getter; se non lo fai, la variabile di istanza non avrà mai la possibilità di essere inizializzata. Ad esempio, la classe EOCPerson potrebbe avere una proprietà per consentire l'accesso a un oggetto complesso che rappresenta il cervello di ogni persona. Se questa proprietà è raramente accessibile e costosi da installare, si potrebbe inizializzare pigramente nel getter, in questo modo:
- (EOCBrain*)brain { if (!_brain) {
_brain = [Brain new];
}
return _brain; }
Se si dovesse accedere direttamente alla variabile di istanza e il getter non era stato ancora chiamato, cervello non sarebbe stato impostato e dovresti chiamare l'accessor per tutti gli accessi alla proprietà del cervello.
- EOC libro di Matt Galloway item7
fonte
2014-11-26 09:17:27
è possibile aggiungere un collegamento alla fonte della documentazione? –
possibile duplicato di [Perché non dovrei usare gli Accessors Obective C 2.0 in init/dealloc? ] (http://stackoverflow.com/questions/192721/why-shouldnt-i-use-obective-c-2-0-accessors-in-init-dealloc) –
@Scott: ho appena aggiunto un collegamento la domanda stessa. –