Un 101 pregunta

Digamos que estoy haciendo una base de datos de coches
y cada uno de los autos objeto se define como:

#import <UIKit/UIKit.h>

@interface Car:NSObject{
    NSString *name;
}

@property(nonatomic, retain) NSString *name;

¿Por qué es @property(nonatomic, retain) NSString *name; y no @property(nonatomic, assign) NSString *name;?

Entiendo que assign no incrementará el contador de referencia como retain va a hacer. Pero ¿por qué utilizar retain, desde name es un miembro de la todo objeto, el ámbito de aplicación es a sí mismo.

Ninguna otra función externa se modifique cualquiera de los dos.

  • Pero, ¿por qué?? Por favor, añada una razón!
  • Simple: un NSMutableString es un NSString. Si alguien te pasa una variable de cadena que se conservan, se puede cambiar después. Y puesto que su propiedad fue NSString tipo, es probable que no se esperaba ese comportamiento. Por lo general, inmutable clases implementan -copia llamando a retener en sí mismos, por lo que es (generalmente) no cuesta cualquier memoria a menos que usted realmente NECESITA que la memoria.
  • ¿Qué acerca de readonly propiedades (@property (nonatomic, retain/assign/copy, readonly) NSString *myString;), es mejor retain, copy, o assign esos?
  • Con una propiedad readonly, retener/copia/asignación no hace ninguna diferencia a la que llaman desde el exterior, pero aún debe reflejar con precisión cómo se está tratando el valor subyacente internamente a la clase. Esto es importante si usted está utilizando el ARCO y @sintetizar para crear su iVars, ya que el compilador uso de su propiedad de la declaración como la indicación de cómo desea que el ARCO de manejar ese valor cuando automáticamente la entrega de retener/liberación.
  • Esto no es totalmente cierto. Habría que verificar de nuevo, pero CREO que si un readonly propiedad de objeto es asignar la función de captador sólo devuelve el valor de la iVar, si es retener o copia, el getter devuelve el valor de la iVar como [[... retain] autorelease], que puede ser una diferencia importante si usted nunca reemplazar el valor de la iVar de alguna manera en el código.
  • ¿Por qué estás añadiendo ios etiqueta a las preguntas que se debe marcar sólo objective-c?

InformationsquelleAutor qstar | 2009-09-04

8 Comentarios

  1. 68

    No hay tal cosa como el «ámbito de un objeto» en Objective-C. Alcance de las reglas no tienen nada que ver con la vida de un objeto — el retener a contar lo es todo.

    Normalmente se necesitan para reclamar la propiedad de sus variables de instancia. Ver el Objetivo-C de la memoria de gestión de reglas. Con un retain los bienes, su propiedad setter los derechos de propiedad de el nuevo valor y la renuncia a la propiedad de la antigua. Con un assign de la propiedad, los alrededores de código para hacer esto, que es tan desastre en términos de responsabilidades y la separación de las preocupaciones. La razón por la que iba a usar un assign propiedad en caso de que usted no puede retener el valor (como el de la no-tipos de objeto como BOOL o NSRect) o cuando la retención podría causar efectos secundarios no deseados.

    Por cierto, en el caso de un NSString, el tipo correcto de la propiedad es generalmente copy. De esa manera no puede cambiar de debajo de usted si alguien pasa en un NSMutableString (que es válido — es es una especie de NSString).

    • Usted debe utilizar la copia en lugar de retener para todas las clases que tiene un mutable variante. Por ejemplo. NSAArray, NSSet, NSDictionary, NSData, NSCharacterSet, NSIndexSet, y NSString.
    • Como regla general, todas las propiedades con las referencias de objeto debe usar copiar o retener, con una sola excepción, los delegados se asigne para evitar las referencias circulares.
    • Efreedom sólo tiene copias de LO preguntas, yo sugeriría que la vinculación a la original ASÍ que la pregunta en su lugar.
    • No sólo los delegados; algo que no es un ser propietario de relación debe utilizar assign en lugar de copy o retain. Los caminos hasta el objeto gráfico debe poseer; los caminos hasta la gráfica (donde se incluye) debe ser que no sea propietario. De lo contrario, puede crear referencias circulares sin tener un delegado en el círculo.
    • Técnicamente, no me dicen que no hay tal cosa como el tiempo de vida del objeto ámbitos en Objective-C. yo diría que el único ámbito de aplicación de cliente es el grupo de liberación automática de la piscina limpia, lo que sucede justo en el principal de la ejecución del bucle y nunca en el medio de cualquier código Objective-C. Pero tal vez eso es sólo un poco demasiado técnico. 😉
    • ¿Por qué asignar? ¿por qué no débil? developer.apple.com/library/ios/documentation/cocoa/conceptual/… se recomienda el uso de referencia débil para evitar las referencias circulares.
    • Esta pregunta fue acerca de retener vs asignar debido a fuertes y débiles propiedades que no existen en 2009. Tienes razón que por lo general, el uso de bajo en estos días.
    • Parece que te estás contradiciendo a ti mismo. Debo usar copy de las clases con mutable variante o de todos de los objetos?

  2. 19

    y no te olvides de acceder a ella a través de

    self.name = something;

    porque

    name = something;

    no importa la generada métodos setter/getter, pero en lugar de asignar el valor directamente.

    • Gracias, esto era muy importante! Siguiendo el consejo en la parte superior respuestas todavía no era retener el valor. Muy importante hacer self.name = ...
  3. 12

    Sin retain hay ninguna garantía de que los NSString* de establecer name con la voluntad de vivir más que la declaración de asignación de la misma. Mediante el uso de la retain de la propiedad para la sintetizado setter usted está permitiendo que decir que el sistema de gestión de memoria que hay al menos un objeto más interesados en mantener el NSString* alrededor.

    • ok…sí, creo que me estoy sorta de geting usted. Por favor, dígame en detalle lo que significa por favor.
    • porque si vivo para conservar método, ¿por qué no para la declaración de asignar
    • El retener asegura de que la estancia con vida, mientras que con ceder, no hay ninguna garantía de que. Retención significa que usted es dueño de ese objeto y siempre que usted es el propietario, que no será destruido. Asignar no le da ninguna garantía.
    • Ahh, bonita respuesta. Pero entonces, ¿por qué no utilizarlo para otras declaraciones como para NSInteger tipos así. @property(nonatomic, retener) NSInteger *nombre;
    • NSInteger no es un objeto.
    • Opps me refería a @property(nonatomic, retener) NSInteger modelID; déjame restat mi argumento. ¿Por qué no el mismo entendimiento se aplican para este caso? A menudo veo @property(nonatomic, asignar) NSInteger modelID;
    • Ahh, Gracias Chuck por Lo primitivas se celebran siempre en la memoria!
    • En realidad, ¿por qué no la misma de la memoria el concepto de gestión se aplican a los valores primitivos así?
    • Algunos tipos (como NSInteger) no se asigna el montón, así que no hay memoria que necesita ser liberada. Tenga en cuenta que NSInteger es un tipo diferente de NSNumber, que no necesita la gestión de la memoria.
    • Si se asigna el montón o no es irrelevante. malloc(sizeof(int)) asigna desde el montón, pero te fallo si se intenta liberar de eso. NSInteger no es un objeto y por lo tanto no responde a los mensajes.
    • ¿Qué significa «ninguna garantía»? ¿Quiere decir que la memoria sólo puede desaparecer en forma aleatoria causando errores? O ¿quiere decir si alguien hizo un [ release ] o [ dealloc ] en «la NSString* se le nombre de la configuración con», entonces sería s.o.l.? También esta es una pregunta aparte, pero una [ dealloc ] va a destruir por completo el NSString independientemente de su recuento de ref, T/F?
    • Si no [retener] el NSString* puede cancelar la asignación de detrás de su espalda; su próxima eliminar la referencia de que sería indefinido de la memoria. [dealloc] nunca debe ser llamado desde dentro de su propio código (de otra que llamar a [super dealloc] en su propio [dealloc]) – todo lo que necesita para llamar a es [retener] y [liberación], y el sistema operativo será llamada [dealloc] cuando sea apropiado.
    • Comprensible respuesta.Entonces me Puedes decir ¿cuál es la diferencia entre Copiar y Conservar

  4. 9

    Para aquellos que están buscando para ello, la documentación de Apple en los atributos de propiedad es aquí.

    • Ese enlace ya no está disponible.
  5. 9

    La self. en:

    self.name = something;

    es importante! Sin ella, se accede a la variable directamente sin tener que pasar por el setter.

    El viejo estilo (me corrigen si me equivoco) hubiera sido:

    [self setName:something];

    De todos modos, esta notación fue (vagamente familiar sonido) el asesoramiento que realmente necesitaba, cuando me fue a buscar para la correcta @properties en NSStrings. Gracias Axel.

    • este es un muy buen info @jem. Por primera vez, creo que es demasiado (comparando con this en Java)
  6. 8

    Después de leer tantos Artículos, PARA que las entradas y realizado aplicaciones de demostración para comprobar la Variable de la propiedad atributos, he decidido poner todos los atributos de la información junto

    1. atómica //por defecto
    2. nonatomic
    3. fuerte=retener //por defecto
    4. débil= unsafe_unretained
    5. retener
    6. asignar //por defecto
    7. unsafe_unretained
    8. copia
    9. readonly
    10. readwrite //por defecto

    así es abajo es el artículo detallado enlace donde se puede encontrar por encima de todos los atributos mencionados, que se desafiantemente ayudarle.
    Muchas gracias a todas las personas que dan mejores respuestas aquí!!

    la Variable de la propiedad de los atributos o Modificadores en iOS

    1. retener = fuerte
      • se conserva, valor antiguo es liberado y se le asigna
      • retener especifica el nuevo valor debe ser enviado a retener en la asignación y el antiguo valor enviado de liberación
      • retener es el mismo como fuerte.
      • apple dice que si usted escribe retener auto convertidos/trabajo como fuerte sólo.
      • métodos como el de «asignación» implícita una «retener»

    Ejemplo:

    @property (nonatomic, retain) NSString *name;
    
    @synthesize name;
    1. asignar
      • asignar es el valor predeterminado y simplemente realiza una asignación de variable
      • asignar es un atributo de la propiedad que indica al compilador cómo sintetizar la propiedad del setter aplicación
      • Que me gustaría utilizar para asignar C propiedades primitivas y débil débil referencias a Objective-C los objetos.

    Ejemplo:

    @property (nonatomic, assign) NSString *address;
    
    @synthesize address;
  7. 3

    De Google Objective-C De La Guía De Estilo cubre esta bastante bien:

    Incubadoras de tomar un NSString, siempre debe copiar la cadena acepta.
    Nunca se acaba de conservar la cadena. Esto evita que la persona que llama cambio de debajo de usted sin su conocimiento. No asuma que porque usted está aceptando un NSString que en realidad, no es un NSMutableString.

  8. 2

    Sería lamentable si su clase tiene este objeto string y luego desapareció de debajo de ti? Usted sabe, al igual que el segundo tiempo de su clase, menciona que el objeto, que ha sido dealloc ed por otro objeto?

    Es por eso que usted desea utilizar el retain setter semántica.

    • Ok. Entonces, ¿por qué siempre no uso retain?
    • Si va a crear una .el delegado de la propiedad, el delegado probablemente retener a USTED. Si usted retiene de nuevo, estamos creando una dependencia de bucle que se traducirá en ningún objeto de llegar desasignado. Por supuesto con ARCO, esta pregunta es obsoleto (usamos «débil» y «fuerte» para dar a entender algo similar en estos días).
    • ni el objeto de llegar desasignado sólo si el Objeto B(había conservado el delegado de Un Objeto) que se estrenó en el Objeto del dealloc.

Dejar respuesta

Please enter your comment!
Please enter your name here