Recientemente intenté compilar un proyecto Xcode anterior (que solía compilar bien), y ahora veo muchos errores de esta forma:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
El patrón de código que causa estos errores siempre se ve así:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Puedo ver por qué se genera el error. Le digo al compilador que sintetice mis accesores de propiedad (tanto getter como setter), y luego inmediatamente anulo el setter manualmente. Ese código siempre olía un poco mal.
Entonces, ¿cuál es la forma correcta de hacer esto? Si uso en @dynamic
lugar de @synthesize
, también tendré que escribir el captador. ¿Es esa la única forma?
atomic
propiedades? En el caso de las propiedades atómicas, podría ser una buena idea mantener sincronizado el par getter / setter con respecto a la estrategia de bloqueo. Esto es difícil si una parte se sintetiza mientras que la otra es código personalizado.Respuestas:
Tuve el mismo problema y después de investigar un poco, aquí está mi conclusión sobre este problema:
El compilador le advierte sobre una
@property
declaración que declaró como atómica (es decir, al omitir lanonatomic
palabra clave), pero proporciona una implementación incompleta de cómo sincronizar el acceso a esa propiedad.Para hacer desaparecer esa advertencia:
Si declara que
@property
a es atómico, realice una de las siguientes acciones:@dynamic
o;@synthesize
y mantener el setter y getter sintetizado o;Si declara
@property
con with(nonatomic)
, puede mezclar implementaciones manuales y sintetizadas de getters y setters.Actualización: una nota sobre la síntesis automática de propiedades
A partir de LLVM 4.0, CLang proporciona síntesis automática para propiedades declaradas que no lo son
@dynamic
. Por defecto, incluso si omite el@synthesize
, el compilador le proporcionará métodos getter y setter. Sin embargo, la regla para las propiedades atómicas sigue siendo la misma: ¡Deje que el compilador proporcione tanto el captador como el definidor, O implemente ambos usted mismo!fuente
Necesitas implementar el getter también. Ejemplo:
fuente
Esta pregunta, entre los otros éxitos principales que obtiene al buscar "propiedad personalizada del objetivo C", no se actualiza con información sobre "setter =" o "getter =".
Entonces, para proporcionar más información sobre esta pregunta:
Puede proporcionar la llamada a @property con su propio método escribiendo
Observe los dos puntos para el método de establecimiento proporcionado.
Referencia de documentación de Apple
EDITAR: No estoy muy seguro de cómo los nuevos cambios en las propiedades de Objective-C (ahora son mucho más inteligentes) cambian las respuestas a esta pregunta. Quizás todo debería estar marcado como desactualizado.
fuente
Para otros que reciben este error, no por la razón que describió OP, es probable que tengan el mismo problema que yo:
Tiene una propiedad @ con el mismo nombre que un método - ().
Algo como esto:
fuente