2012-02-06 13 views
20

Esta es una pregunta de dos partes con la esperanza de que pueda comprender más sobre el tema.aclaración de declaración de propiedad de iOS

1) Me parece que tiene dos opciones populares para declarar una propiedad de una claseen objective c. Una es agregar la propiedad al cuerpo de la clase del encabezado, por ej.

@interface MyClass : NSObject { 
    NSArray *myArray; 
} 

O puedes añadir después que el cuerpo @interface y antes de la declaración @end como tal.

@interface MyClass : NSObject { 
    // 
} 

@property (nonatomic, retain) NSArray *myArray; 

¿Cuál es la diferencia entre estos dos "estilos" y cuándo elegir uno sobre el otro?

2) después del @property se encuentran opciones como (nonatomic, retain). ¿Para qué sirven y por qué/cuándo utiliza diferentes opciones?

Respuesta

47

Éstos son los únicos modificadores de las propiedades que Xcode reconoce:

  • nonatomic (no hace cumplir hilo de seguridad en la propiedad, principalmente para su uso cuando sólo un hilo se utiliza a través de un programa)
  • atomic (hace cumplir hilo de seguridad en la propiedad, principalmente para su uso cuando se usan múltiples hilos a lo largo de un programa) (por defecto)
  • retain/strong (retiene automáticamente/comunicados de valores en conjunto, hace que valores seguros no DEALLOCATE inesperadamente) (por defecto si ARC y tipo de objeto)
  • readonly (propiedad no se puede establecer)
  • readwrite (ambos pueden establecer y obtener la propiedad) (por defecto)
  • assign/unsafe_unretained (sin gestión de memoria se puede hacer con esta propiedad, que es manejado manualmente por la persona que la asignación del valor) (por defecto si no se ARC o tipo de objeto)
  • copy (copias del objeto antes de que, en Casos en los que el valor establecido no debe cambiar debido a factores externos (cadenas, matrices, etc.).
  • weak (ceros automáticamente la referencia debe cancelar la asignación del objeto, y no retiene el valor pasado)
  • getter=method (ajusta el selector utilizado para obtener el valor de esta propiedad)
  • setter= method (ajuste el selector usado para establecer el valor de esta propiedad)
+3

parte de este única respuesta 2 de la pregunta. La respuesta de Simon discute la parte 1. –

+0

@MarkAmery por supuesto - Sentí que la parte 1 era realmente básica, y otras respuestas la cubrieron mientras respondía. No es necesario agregar información duplicada aquí. –

+1

# 2 es completamente incorrecto. las propiedades 'atómicas' * no * garantizan la seguridad del hilo; más bien asegura la atomicidad. Si tanto el hilo A como el hilo B escriben, 'atómico' asegura que el resultado será un valor completo, es decir, uno u otro. Cuál es indefinido Escribir código seguro para subprocesos no es tan simple como usar propiedades 'atómicas'. Consulte la sección "Sincronización" de la Guía de programación de Threading: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i -CH8-SW1 –

0

La primera será una declaración privada y no será accesible para otras clases si no define la segunda. El segundo se usa junto con el módulo @synthesize in .m, y el compilador crea los setter/getter. Aún puede definir su propio getter o setter con esto. En este caso, se puede acceder a todos los iVars definidos en @property por otras clases. Las operaciones de retención/liberación se realizan automáticamente. Debería leer la documentación de Apple para más detalles. favor verifica: What's the difference between the atomic and nonatomic attributes?

28

1) @property es una forma especial de definir getter- y setter-methods, o como los llamamos accessors en Objective-C. Su primer fragmento solo declara una matriz para la cual tiene que declarar y escribir los descriptores de acceso usted mismo. Por ejemplo setMyArray: y myArray.
El uso de @property declarará sus accesadores por usted y es equivalente a declarar setMyArray: y myArray usted mismo. Es la forma preferida de declarar accesores desde Objective-C 2.0. Tenga en cuenta que aún tiene que declarar la propiedad (en su caso myArray) usted mismo.

2) Primero necesita saber acerca de @synthesize. Recuerde que @property DECLARA los accesadores para su propiedad, @synthesize los IMPLEMENTARÁ. Cuando usas @property en tu @interface es muy probable que escribas @synthesize en @implementation. Usar @synthesize es equivalente a implementar setMyArray: y myArray.
Los atributos (nonatomic, retain) le dicen al compilador, entre otros, cómo debería funcionar la administración de la memoria y, por lo tanto, cómo se implementarán los métodos. Tenga en cuenta que nunca verá estos accesos, pero tenga la certeza de que están allí y listos para que los use.

Para leer más sobre este tema, recomiendo leer la Sección 9 en Propiedades de la siguiente Tutorial o comprar una Book que cubra una Introducción a Objective-C.

También debe familiarizarse con al menos los siguientes atributos:

  • acceso
    • Elija readwrite (por defecto) o readonly. Si se establece readonly, SOLAMENTE los métodos getter estarán disponibles.
  • Setter Gestión de memoria
    • assign (por defecto), simplemente asigna el nuevo valor. Lo más probable es que solo lo use con tipos de datos primitivos.
    • retain, libera el valor anterior y conserva el nuevo. Si usa el recolector de basura, retain es equivalente a assign. ¿Por qué? La liberación manual del valor anterior será realizada por el recolector de basura.
    • copy copiará el nuevo valor y liberará el valor anterior. Esto a menudo se usa con cadenas.
  • enhebrar
    • atomic (por defecto) se asegurará de que el método de selección es atómica. Esto significa que solo un hilo puede acceder al colocador de una vez.
    • nonatomic, utilice esto cuando no trabaje con hilos.

This post le da una buena introducción a la gestión de memoria y assign, retain y copy.

+0

@Jackson, ¿puedo amablemente pedirle que acepte mi respuesta? Si no es aceptable, dígame qué puedo hacer para mejorar mi respuesta. Realmente apreciaría la reputación que ganaría, ¡gracias! – Simon

+2

Hey, amigo, honestamente, creo que "Richard J. Ross III" tuvo una respuesta más * concisa * para un lector como yo. Sin embargo, te puse como un +1 porque obviamente pusiste * mucho esfuerzo * en tu respuesta. Además, veo el * concepto de negocio * al preguntar por qué no acepté su respuesta, pero creo que es un * "aplazamiento" * para pedirle a alguien que acepte su respuesta. Estoy seguro de que todos son * diferentes * con respecto a este tema. Ahí está mi doble sentido de todos modos. – Jacksonkr

2

Las propiedades son básicamente los métodos de acceso. Ellos definen el alcance de la variable. Primer caso como el anterior, la variable no es accesible en otras clases, mientras que al declarar una propiedad como en el segundo caso, también se puede acceder a la variable en otras clases. Además, son útiles para la administración de la memoria.

+0

Una variable de instancia puede hacerse accesible para otras clases, al declararlas '@ public'. – newacct

0

Las propiedades son básicamente los métodos de acceso. Ellos definen el alcance de la variable. por el acceso specifior por defecto de la variable está protegida y propiedades establezca su especificador de protegida para Pública

Cuestiones relacionadas