113 votos

error: Escritura propiedad atómica no puede asociar un setter/getter sintetizado con un setter/getter definidos por el usuario

Recientemente he intentado compilar un viejo proyecto de Xcode (el que se utiliza para compilar muy bien), y ahora estoy viendo un montón de errores de este formulario:

error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter

El patrón de código que hace que estos errores siempre se parece a esto:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
    //..
}

Puedo ver por qué el error se genera. Yo digo que el compilador para sintetizar mi descriptores de acceso (ambos métodos getter y setter)y, a continuación, inmediatamente después de anular el setter manualmente. Que el código tiene siempre olía un poco apagado.

Así que, ¿cuál es la manera adecuada de hacer esto? Si utilizo @dynamic en lugar de @synthesize, tengo que escribir la función de captador así. Es que la única manera?

197voto

octy Puntos 4735

Yo tenía el mismo problema y después de hacer un poco de investigación, he aquí mi conclusión acerca de este tema:

El compilador advierte acerca de un @property que declara como atómico (es decir, por la omisión de la nonatomic de palabras clave), sin embargo, puede proporcionar una aplicación incompleta de cómo sincronizar el acceso a la propiedad.

Para hacer que la advertencia de que desaparecen:

Si se declara una @property , para ser atómicas, a continuación, realice una de las siguientes:

  • uso @dynamic o;
  • uso @synthesize y mantener la sintetizado setter y getter o;
  • proporcionar un manual de aplicación de ambos en el setter y getter (sin el uso de una de las directivas de arriba).

Si se declara la @property con (nonatomic) , a continuación, usted puede mezclar manual y sintetizado de las implementaciones de getters y setters.

Actualización: Una Nota sobre la Propiedad de Auto-Síntesis

Como de LLVM 4.0, CLang proporciona auto-síntesis para declarado propiedades que no son de @dynamic. Por defecto, incluso si se deja fuera la @synthesize, el compilador se proporcionan los métodos getter y setter para usted. Sin embargo, la regla para atómica propiedades sigue siendo la misma: o Bien dejar que el compilador de proporcionar tanto a los getter y setter, O aplicarlas tanto a ti mismo!

11voto

Matias Forbord Puntos 151

A esta pregunta, entre el resto de los mejores aciertos de la búsqueda para "objective C propiedad personalizada", no se actualizan con la información acerca de "setter =" o "getter =".

Así, para el suministro de más información sobre esta cuestión:

Usted puede suministrar a la @de la propiedad de la llamada con su propio método por escrito

    @property(setter = MySetterMethod:, getter = MyGetterMethod)

Aviso el colon para la suministrados método setter.

Referencia de la documentación de Apple

EDICIÓN: No estoy muy seguro de cómo los nuevos cambios en Objective-C las propiedades (que son mucho más inteligentes ahora) cambiar las respuestas a esta pregunta. Quizá todo debe ser marcada como fuera de fecha.

9voto

arturgrigor Puntos 1850

Tienes que poner el getter también. Ejemplo:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

- (void)setSomeProperty:(NSObject *)newValue
{
    @synchronized (self)
    {
        // ...
    }
}

- (NSObject *)someProperty
{
    NSObject *ret = nil;

    @synchronized (self)
    {
        ret = [[someProperty retain] autorelease];
    }

    return ret;
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X