2012-10-04 28 views
8

Soy muy nuevo en Objective C. (Hace dos días). Cuando leí acerca de @synthesize, pareció superponerse con mi comprensión @property (que pensé que entendía) ... Por lo tanto, algunos detalles deben ser resueltos en mi mente ... me está molestando.@property y @synthesize

Por favor, corríjanme si me equivoco sobre las diferencias de @property y @synthesize:

Si se declara una @property en su @interface, entonces usted está diciendo al mundo que los usuarios pueden esperar utilizar captadores y definidores estándar para esa propiedad. Futhermore, XCode hará getters genéricos y setters para usted. ... PERO, ¿en qué medida ocurre que con la declaración @property? (IE quiere decir que "por completo" ... como declaraciones invisibles para él en su @interface, y también el código oculto en su @interface?

O bien

Hace @property cuidar de las declaraciones de código que no se ven en su @interface única - mientras que @synthesize se encarga de la ejecución de código no visto en su sección @implementation)

+3

Piense de esta manera si tiene una '@ propiedad' más que probable que necesite la' @ sintetizar'. Esto es porque sí '@ property' le está diciendo al mundo que se necesitan un' getter' y 'setter' genérico pero que' @ synthesize' en realidad está creando los 'getters' y' setters', puede anular esto y crear su propio 'getters' y' setters' si te gustan como los generados serán muy básicos. Echa un vistazo al desarrollo de aplicaciones de iTunesU 'iPad y iPhone por Paul Hegarty' Esta es la forma en que pienso y aún no ha fallado. – Popeye

+0

Muchas gracias Popeye ... ITunes U es FANTÁSTICO !!! De hecho, estoy en la lección 4 o en la serie de Paul 2011. Solo estoy retrocediendo, leyendo XCode 4 Learning Objective C junto a esta serie ... aún esto no fue explícitamente claro para mí. – RichWalt

Respuesta

7

@property declara una propiedad en su clase con cualquier atomicidad y setter semántica suministrados por el usuario.

Con Xcode 4.4, la autosíntesis está disponible en donde se le proporciona un respaldo ivar de su propiedad sin declararlo en @synthesize. Este ivar tiene la forma de _propertyName donde el nombre de su propiedad es propertyName.

+0

Esto ha golpeado el clavo en la cabeza, corto dulce y simple. +1 – Popeye

+0

Sí ... Sabía que podía "respaldar su var de propiedad" con un ivar diferente (que debería ser utilizado por su clase, y especialmente con los getters y setters). Muchas gracias por su respuesta. ... Me he sentido abrumado por la velocidad con la que llegan respuestas útiles ... (¡Esta es mi primera publicación aquí después de unirme hace solo unos minutos)! - Gracias por tomarse el tiempo para hacer este post Alan! – RichWalt

16

En primer lugar, tenga en cuenta que la última versión de Xcode ya no requiere @synthesize. Puedes (y deberías) simplemente omitirlo. Dicho eso, esto es lo que hacen las piezas.

@property es una declaración de acceso. Es solo una declaración. Hay muy poca diferencia entre lo siguiente:

@property (nonatomic, readwrite, strong) NSString *something; 

vs

- (NSString *)something; 
- (void)setSomething:(NSString)aSomething; 

La principal diferencia es que la declaración de estos métodos utilizando @property permite que el compilador genere automáticamente (sintetizar) las implementaciones para usted. No es necesario que permita que el compilador lo haga por usted. Usted es absolutamente libre de implementar something y setSomething: a mano, y es común hacerlo. Pero, si no los implementa a mano, el compilador creará automáticamente un ivar para usted llamado _something y creará una implementación razonable para el captador y el colocador.

En las versiones anteriores de Xcode, tenía que solicitar explícitamente la autogeneración utilizando la palabra clave @synthesize. Pero eso ya no es necesario. Hoy, la única razón para usar @synthesize es si desea que el ivar tenga un nombre no estándar (nunca lo haga).

Un punto clave aquí es que los métodos y somethingsetSomething: son sólo métodos . No hay nada mágico sobre ellos. No son métodos especiales de propiedad."Son sólo los métodos que para el acceso a la convención un pedazo de estado que pedazo de estado se almacena a menudo en un Ivar, pero no tiene por qué ser

Para ser aún más claro:.. object.something hace no media" devolver el Ivar llamado _something de object." Esto significa 'devolver el resultado de [object something], sea lo que hace.' es común que los que para devolver el valor de una Ivar.

Usted debe declarar la totalidad de su estado (interna y externo) con las declaraciones @property, y debe evitar declarar directamente ivars. También debe acceder siempre a sus propiedades a través de sus descriptores de acceso (self.something), excepto en los métodos init y dealloc. En init y dealloc, debe usar directamente el ivar (_something).

+0

Rob, muchas gracias por su tiempo y respuesta. Ver videos de iOS en iTunes U desde el año pasado (2011) ... y tratar de mantenerse al día con los cambios que se producen en XCode ocasionan cierta confusión. Escuchando con atención al instructor, e incluso haciendo pruebas con un código simple ... diablos, incluso la lectura de la documentación de XCode no aclaraba por completo que @synthesis no era necesario. Una confirmación útil como la tuya aumenta la confianza de que no aprendí nada malo ... mientras continúo. :-) Ahora ... si alguien tiene algún enlace externo donde pueda empezar a pensar correctamente sobre MVC, ¡sería genial! – RichWalt

+0

Comience aquí: http://developer.apple.com/library/ios/#documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html%23//apple_ref/doc/uid/ TP40010810-CH14. Luego aquí: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457 –

+0

¡Estoy investigando esto ahora! ¡¡¡¡Un millón de gracias!!!! – RichWalt

Cuestiones relacionadas