2011-08-16 24 views
16

He visto readwrite en int, BOOL etc. igual que nonatomic, assign.¿Cuál es la diferencia entre una propiedad de lectura y una propiedad de asignación no atómica?

Estoy algo confundido con esto. Sé que en objetos no nativos, normalmente no lo hacemos, conservamos.

+0

Ver también: [Atómica vs propiedades no atómicas] (http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties) – PengOne

+0

Ver también : objetivo c 101 (conservar vs asignar) @ http://stackoverflow.com/questions/1380338/objective-c-101-retain-vs-assign-nsstring –

Respuesta

15

readwrite significa que existe un getter y un setter; el opuesto es readonly. Normalmente, la única vez que declararía explícitamente una propiedad readwrite es en una extensión de clase para una clase donde la interfaz pública declara la propiedad readonly, por lo que es públicamente de solo lectura, pero internamente puede obtenerla y establecerla.

+2

muy buena respuesta. es importante saber cuándo 'readwrite' debería incluso usarse –

+0

@Chuck, el setter de readwrite será equivalente a asignar o retener el setter? –

+0

@VishalSingh: 'readwrite' no especifica la gestión de memoria. Te gustaría * también * enumerar un atributo de administración de memoria para la propiedad. – Chuck

30

Aquí está la respuesta corta:

atomic vs nonatomic asegura principalmente que los valores completos se devuelven desde captadores sintetizados y que los valores completos son escritos por los emisores sintetizados

readwrite vs readonly determina si (atómica es por defecto.) una propiedad sintetizada tiene un acceso sintetizado o no (readwrite tiene un setter y es el predeterminado, readonly does not).

assign vs retain vs copy determina cómo los descriptores de acceso sintetizados interactúan con el esquema de gestión de memoria Objetivo-C:

  • assign es el valor predeterminado y simplemente realiza una asignación de variable
  • retain especifica el nuevo valor debe ser enviado -retener en la asignación y el valor anterior enviado -release
  • copy especifica que se debe enviar el nuevo valor -copy en la asignación y el valor anterior enviado -release.
+0

+1 muchas gracias por esto :) – swiftBoy

15

Después de leer tantos artículos, serán puestos y aplicaciones de demostración realizados para comprobar los atributos de propiedad variable, decidí poner toda la información atributos juntos

  1. atómica // predeterminado
  2. no atómica
  3. fuertes = conservan por defecto //
  4. débil = unsafe_unretained
  5. retener
  6. asignar por defecto //
  7. unsafe_unretained
  8. copia
  9. sólo lectura
  10. lectura-escritura por defecto //

es abajo es el enlace detallado artículo donde se puede encontrar mencionado anteriormente, todos los atributos que le ayudarán desafiante tú. ¡Muchas gracias a todas las personas que dan mejores respuestas aquí!

Variable property attributes or Modifiers in iOS

  1. retener = fuerte
    • se retiene, valor antiguo es liberado y se le asigna
    • conservan especifica el nuevo valor debería enviarse -retain en la asignación y el valor anterior enviado -release
    • retener es lo mismo que fuerte.
    • apple dice que si escribes retener, se convertirá automáticamente/funcionará solo como fuerte.
    • métodos como "alloc" incluyen un implícito "retienen"

Ejemplo:

@property (nonatomic, retain) NSString *name; 

@synthesize name; 
  1. asignar
    • Asignar es el valor predeterminado y simplemente realiza una asignación variable
    • asignar es un atributo de propiedad que le dice al compilador cómo sintetizar la implementación del setter de la propiedad
    • Usaría la asignación para propiedades primitivas C y débil para referencias débiles a objetos Objective-C.

Ejemplo:

@property (nonatomic, assign) NSString *address; 

@synthesize address; 
  1. sólo lectura

    • declarar su propiedad como de sólo lectura le dice compilador para no generar método setter automáticamente.
    • Indica que la propiedad es de solo lectura.
    • Si especifica de solo lectura, solo se requiere un método getter en el bloque @implementation. Si usa la directiva @synthesize en el bloque @implementation, solo se sintetiza el método getter. Además, si intentas asignar un valor usando la sintaxis de puntos, , obtienes un error de compilación.

Ejemplo:

@property (nonatomic, readonly) NSString *name; 

@synthesize name; 
  1. lectura y escritura
    • setter y getter generado.
    • Indica que la propiedad debe tratarse como de lectura/escritura.
    • Este atributo es el predeterminado.
    • Se requieren un método getter y setter en el bloque @implementation. Si usa la directiva @synthesize en el bloque de implementación , los métodos getter y setter se sintetizan.

Ejemplo:

@property (nonatomic, readwrite) NSString *name; 

@synthesize name; 
+3

débil! = Unsafe_unretained – jrturton

+0

@jrturton Por favor, lea [esto] (http://stackoverflow.com/questions/9784762/strong-weak-retain-unsauta-assignature-assign) y [esto] (http://stackoverflow.com/questions/11121839/differences-between-weak-and-unsafe-unretained) y corrígeme si me equivoco !! – swiftBoy

+2

El segundo enlace lo dice todo. unsafe_unretained no anula la referencia cuando se desasigna, por lo que le queda un puntero colgante, mientras que una propiedad débil se establece en nil cuando se desasigna el objeto. Pre-ios 4.3, débil no era compatible. – jrturton

Cuestiones relacionadas