2012-12-11 15 views
13

Mam zdefiniowane właściwości ...nieruchomość nie pracuje z getter I seter

@property (nonatomic, strong) NSArray *eventTypes; 

Chcę zastąpić getter i setter ...

Pisałem to ...

- (void)setEventTypes:(NSArray *)eventTypes 
{ 
    _eventTypes = eventTypes; 

    //do some stuff here. 
} 

działa to dobrze, ale kiedy potem dodać to ...

- (NSArray*)eventTypes 
{ 
    //do some stuff here. 

    return _eventTypes; 
} 

Następnie obie funkcje pokazują błędy i nie wiadomo, co to jest typ _eventTypes.

To samo dotyczy. Działa z jedną funkcją, ale gdy tylko dodaję drugą, zawodzi obie.

Czy jest coś jeszcze, co muszę zrobić w tym celu? Wydaje się dziwne, że działa z jednym botem, a nie jednym i drugim.

+3

Czy masz zdefiniowane '_eventTypes' w swojej klasie? Oprócz właściwości musisz zadeklarować zmienną w pliku nagłówkowym. Również (i nie jestem w 100% pewny) może zajść potrzeba użycia '@ synthesize' na tej właściwości, nawet jeśli piszesz własny getter i seter (w ten sposób twój getter i setter przesłaniają syntezatory). – benwad

+3

'@synthesize eventTypes = _eventTypes;' zrobi sztuczkę – Alladinian

+1

Nie musisz już używać właściwości '@ synthesize' od Xcode 4.5. Powiedziawszy to, dodałem '@ synthesize' i zadziałało! Dziwne! Dzięki – Fogmeister

Odpowiedz

2

Dodaj ten w @implementation

@synthesize eventTypes = _eventTypes; 
+1

Dzięki za odpowiedź: D – Fogmeister

+0

@Fogmeister :-) –

-8

Spróbuj tego:

- (void)setEventTypes:(NSArray *)eventTypes 
{ 
    self.eventTypes = eventTypes; 

    //do some stuff here. 
} 
- (NSArray*)eventTypes 
{ 
    //do some stuff here. 

    return self.eventTypes; 
} 
+0

To spowoduje nieskończone pętle i nigdy nie powinno być używane. – Logan

+0

@Logan, chyba że masz ochotę na nieskończone pętle – codrut

1

Trzeba @synthesize swoją nieruchomość. Używamy go, gdy chcemy utworzyć niestandardowe moduły pobierające i ustawiające, takie jak:

  • Właściwość odczytu/zapisu z niestandardowym programem pobierającym i ustawiającym;
  • ReadOnly własność z niestandardowym geterem;

bezpośrednio po dokonaniu @implementation w pliku .m, dodać:

@synthesize propertyName = _propertyName; 

to powiedzieć, aby kompilator chcą uzyskać kontrolę nad metodami 'get' i 'set' tego konkretnego własność. Więc po tym twoja implementacja zestawu i get będzie działała dobrze.


Dodatkowe wyjaśnienia:

self.anyString = @ "TEXT"; jest dokładnie równoważny [self setAnyString: @ "TEXT"]; Oba wywołują zestaw metod. Jeśli używasz _anyString, uzyskujesz bezpośredni dostęp do właściwości bez przechodzenia przez ustawioną metodę.

Z tego powodu, jeśli nazwiemy siebie jako .Właściwość wewnątrz metody zestawu utworzymy nieskończoną pętlę. Kiedy przepisujemy metody "set" i "get" Musimy użyć self = _ zamiast ..

+0

To pytanie zostało wysłuchane 4 lata temu, a twoja odpowiedź jest prawie taka sama jak zaakceptowana odpowiedź. – Fogmeister

+1

Przyszedłem tutaj z najnowszego pytania, które było podobne do twojego. Właśnie widziałem, że facet umieścił link. W każdym razie przepraszam, jeśli cię zawracam, zostawię moją odpowiedź, jeśli ktoś nie zobaczy linku i przeczyta tutaj małe wyjaśnienie. Dzięki za komentarz. –

+1

Wystarczająco fair. :) – Fogmeister

Powiązane problemy