2012-12-11 26 views
13

ho definita una proprietà ...proprietà non si lavora con getter e setter

@property (nonatomic, strong) NSArray *eventTypes; 

voglio ignorare il getter e setter ...

Ho scritto questo ...

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

    //do some stuff here. 
} 

questo funziona bene, ma quando ho poi aggiungi a ...

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

    return _eventTypes; 
} 

Quindi entrambe le funzioni mostrano errori e non sanno cosa sia _eventTypes.

Questo è lo stesso in entrambi i casi. Funziona con una funzione, ma non appena aggiungo l'altra fallisce entrambe.

C'è qualcos'altro che devo fare per questo? Sembra strano che funzioni con entrambi i bot, non con entrambi.

+3

Hai '_eventTypes' definito nella tua classe? Oltre alla proprietà dovrai dichiarare la variabile nel file di intestazione. Inoltre (e non ne sono sicuro al 100%) potrebbe essere necessario usare '@ synthesize 'su quella proprietà anche se si sta scrivendo il proprio getter e setter (in questo modo, il getter e il setter sovrascrivono quelli sintetizzati). – benwad

+3

'@synthesize eventTypes = _eventTypes;' farà il trucco – Alladinian

+1

Non hai più bisogno delle proprietà '@ synthesize' a partire da Xcode 4.5. Detto questo, ho aggiunto '@ synthesize' e ha funzionato! Strano! Grazie – Fogmeister

risposta

20

Anche se la LLVM si auto sintetizzare l'Ivar supporto (preceduto da un trattino per impostazione predefinita), nel caso in cui si sceglie di implementare entrambi i metodi getter e setter si vuole non ottenere un ivar auto-sintetizzato ed è per questo che è necessario @synthesize eventTypes = _eventTypes; manualmente.

Si può leggere di più su questo qui: http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html

2

Aggiungere questo @implementation

@synthesize eventTypes = _eventTypes; 
+1

Grazie per la risposta: D – Fogmeister

+0

@Fogmeister :-) –

-8

provare questo:

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

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

    return self.eventTypes; 
} 
+0

Ciò causerà loop infiniti e non dovrebbe mai essere utilizzato. – Logan

+0

@Logan a meno che non ti piacciano i loop infiniti – codrut

1

dovete @synthesize vostra proprietà. L'usiamo quando vogliamo creare un getter e setter personalizzati, come:

  • di lettura/scrittura con getter e setter personalizzati;
  • Proprietà ReadOnly con getter personalizzato;

subito dopo l'@implementation in un file .m, aggiungere:

@synthesize propertyName = _propertyName; 

Questa dici a compilatore si vuole ottenere il controllo dei metodi 'get' e 'set' di quello specifico proprietà. Quindi dopo che la tua implementazione di set e get funzionerà correttamente.


spiegazioni extra:

self.anyString = @ "TEXT"; è esattamente equivalente [self setAnyString: @ "TEXT"]; Entrambi chiamano il set di metodi. Se si utilizza _anyString, si accede direttamente alla proprietà senza passare attraverso il metodo set.

Quindi, per questo motivo, se si chiama un auto .proprietà all'interno del metodo set creeremo un ciclo infinito. Una volta riscritta i metodi 'set' e 'get' Dobbiamo usare _ invece di self..

+0

Questa domanda ha avuto risposta 4 anni fa e la tua risposta è praticamente la stessa della risposta accettata. – Fogmeister

+1

Sono venuto qui da una nuova domanda che era abbastanza simile alla tua. Ho appena visto che il ragazzo ha messo un link. Comunque scusa se ti ho infastidito, lascerò la mia risposta se qualcuno non vede il link e leggi qui una piccola spiegazione. Grazie per il tuo commento. –

+1

Abbastanza giusto. :) – Fogmeister

Problemi correlati