Quiero anular el getter y setter en mi ObjC clase con ARCO.

.h Archivo

@property (retain, nonatomic) Season *season;

.m Archivo

@synthesize season;


- (void)setSeason:(Season *)s {
    self.season = s; 

    //do some more stuff
}

- (Season *)season {
    return self.season;
}

Que me estoy perdiendo algo aquí?

  • Tenga en cuenta que este patrón lleva a la locura; en particular, esto significa que setSeason: siempre debe ser atómica, integral, operación en su modelo de datos. Si el código se evolucione de tal manera que no era otra propiedad, cuyo valor depende de season, entonces usted está a la izquierda con un orden de dependencia («debo» otros » antes de que me llame setSeason: porque setSeason: tiene lógica del negocio que depende de los ‘otros’). Mejor mantener setter/getter estúpido simple y seguir la lógica de negocio independiente.
  • Bueno, en mi caso, voy a actualizar la vista con los nuevos datos de la season
  • Pero si mantener el setter/getter estúpido simple y seguir la lógica de negocio independiente que acabo de mudar el problema. Ahora habría que recordar que cada vez que usted llame setSeason: usted también tiene que llamar someBusinessLogicBasedOnSeason: y usted todavía tiene que preguntarse si usted necesita para hacer todo eso antes o después de ajustar otros.
  • Un buen modelo es el uso de incubadora para invalidar los datos, por ejemplo, hay dos incubadoras setSeason:, setYear: y ambos hacen _seasonalDataNeedsUpdate = YES;. Real actualización se produce más tarde, si todavía es necesario (por ejemplo, si el usuario no cancela). Esta se ocupa de orden y asegura que no tire de la misma información varias veces.
  • Oh mi dios ilya, muchas gracias! Yo estaba, literalmente, tirar de mi pelo, preguntándose por qué la _ la notación a veces funcionan y a veces no.
InformationsquelleAutor alex | 2012-01-04

3 Comentarios

  1. 88

    Sí, esos son infinitos bucles recursivos. Eso es porque

    self.season = s;

    es traducido por el compilador en

    [self setSeason:s];

    y

    return self.season;

    se traduce en

    return [self season];

    Deshacerse de la punto de descriptor de acceso self. y su código será correcta.

    Esta sintaxis, sin embargo, puede ser confuso dado que su propiedad season y su variable season comparten el mismo nombre (aunque Xcode algo va a disminuir la confusión por la coloración de aquellas entidades de manera diferente). Es posible cambiar explícitamente su nombre de la variable por escrito

    @synthesize season = _season;

    o, mejor aún, se omite el @synthesize directiva por completo. El moderno Objective-C, el compilador automáticamente sintetizar los métodos de descriptor de acceso y la variable de instancia para usted.

    • La mejor explicación. Aceptado!
    • Quiero conocer al genio que hizo self.season = s ser traducido a [self setSeason:s]
    • eso es sólo cómo la notación de punto funciona. ¿Qué preferiría el método se llama?
    • Sería mejor si sólo acceder al atributo. Dos cosas diferentes: el acceso a los atributos y llamar a método setter.
    • En Xcode 5, si proporciona personalizado getter y setter, el sistema ya no sintetiza la variable miembro. Usted debe usar @sintetizar para ello. No es opcional, como usted ha sugerido.
  2. 16

    Si se va a implementar sus propios métodos getter y setter, usted necesita para mantener una variable interna:

    @synthesize season = _season;
    
    - (void)setSeason:(Season *)s {
        //set _season
        //Note, if you want to retain (as opposed to assign or copy), it should look someting like this
        //[_season release];
        //_season = [s retain];
    }
    
    - (Season *)season {
        //return _season
    }
    • Bonito, gracias que hizo el trabajo. Le recomendamos el uso de _season en lugar de self.season todo el tiempo entonces?
    • Los guiones bajos ( _ ) es una cuestión de preferencia, pero deja claro que es una variable interna.
    • Así la variable interna season siempre está ahí. La única cosa season = _season hace es cambiar el nombre de esta variable. Sin embargo, esto no es necesario. @jlehr explicó cómo funciona esto.
    • impresionante, me has salvado de 2 días de ajustes en mi código. especialmente este bit //Nota, si desea conservar (como opuesto a asignar o copia), debería quedar algo como esto //[_season release]; //_season = [s retener];
    • Tenga en cuenta que la variable interna de hecho por defecto _season, @synthesize season = _season es innecesario.
  3. 5

    Lo que está faltando es que el Objetivo-C compiler, básicamente, convierte la self.foo = bar sintaxis en [self setFoo:bar], y self.foo en [self foo]. Sus métodos, como está implementado, se llaman a sí mismos. Como Jeremy sugiere, es necesario implementar, de tal modo que el setter en realidad, se asigna el valor se llama a una variable de instancia en su clase y la función de captador devuelve el valor de la variable de instancia.

Dejar respuesta

Please enter your comment!
Please enter your name here