Mam klasę A
, która eksponuje sposób pobierania i ustawiania obiektu typu Foo
. W żargonie własności, to zazwyczaj zadeklarować to w interfejsie:Jak mogę zadeklarować wartość @, ale uniemożliwić jej utworzenie ivar?
@property (nonatomic, strong) Foo * foo;
to (w nowoczesnych ObjC) wytwarza zarówno dostępowych i sieci AN ivar, _foo
do przechowywania.
Jeśli chcę wykonać niestandardową pracę w akcesoriach, mogę samodzielnie wykonać jedną lub obie z nich. Ale co, jeśli nie chcę tylko wykonywać niestandardową pracę, w rzeczywistości nie chcę, aby ivar? Innymi słowy, robię coś innego z obiektem Foo, jak przekazywanie go tam iz powrotem do innego wewnętrznego obiektu, z którym jestem skomponowany. Nie muszę w ogóle przechowywać pamięci dla foo
w instancji A
.
Wydaje się, że mam dwie możliwości:
- zadeklarować właściwości, wdrożyć zarówno akcesorów i po prostu zignorować faktu, że kompilator tworzy przechowywania
_foo
i nigdy go używać. - Zadeklaruj wyraźnie moje akcesory:
- (Foo *)foo
i- (void)setFoo:(Foo *)foo
w interfejsie, tak jak kiedyś w przedmodernistycznym ObjC.
Pierwszy wydaje się nieelegancki w czasie wykonywania, a drugi wydaje się nieelegancki w deklaracji (gdzie prawdopodobnie miałbym teraz mieszankę właściwości i właściwościopodobnych akcesorów).
Czy istnieje sposób, aby zadeklarować nieruchomość i czy ma ona służyć wyłącznie jako deklaracja?
Masz rację! Dzięki za wskaźnik doktora, tęskniłem za tym. Uważam, że to zachowanie jest trochę magiczne jak na mój gust, ale cieszę się, że o tym wiem. –
Jak można zauważyć w dokumentacji, możesz zadeklarować właściwość jako 'readonly' lub' writeonly' i nadpisać tylko ten akcesor i uniknąć utworzenia zmiennej. – nhgrif