2011-05-31 13 views
8

Leí en alguna parte que con NSString en un objeto, uno tiene que usar copy en lugar de retener. ¿Alguien puede explicar si esto es correcto y por qué?¿Utilizo retener o copiar en mi singleton?

Por ejemplo, tengo la siguiente declaración para mi Singleton:

#import <foundation/Foundation.h> 
@class FaxRecipient; 

@interface MyManager : NSObject { 
    NSString *subject; 
    NSString *reference; 
    NSString *coverSheet; 
    FaxRecipient *faxRecipient; 

} 

@property (nonatomic, retain) NSString *test1; 
@property (nonatomic, retain) NSString *test2; 
@property (nonatomic, retain) NSString *test3; 
@property (nonatomic,retain) FaxRecipient *faxRecipient; 



+ (id)sharedManager; 

@end 
+1

El código que ha mencionado es correcto. Tienes que usar retener. – Satyam

+0

Tengo entendido que también debo usar retener. Me interesarían aquí las teorías alternativas y las razones para ellas. Una razón que me viene a la mente es que copiar significa que si pasas NSMutableString en lugar de NSString, tu clase no se verá afectada si otra cadena cambia la cadena mutable. NSString sería diferente porque es fijo. – drekka

+1

posible duplicado de http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain – Jason

Respuesta

8

Creo que "tiene que" en el sentido del deber es un poco fuerte.Usted puede uso ya sea copy o retain, pero usted debe generalmente usan copy para sus propiedades NSString* porque:

  1. Por lo general, no quiere una propiedad de cadena para cambiar debajo de la nariz;
  2. NSMutableString es una subclase de NSString, por lo que es muy posible que alguien pueda establecer su propiedad NSString* para apuntar a una cadena mutable, creando así la posibilidad de que la cadena se modifique mientras la usa;
  3. Para clases inmutables como NSString, las operaciones de copia terminan simplemente reteniendo el objeto original de todos modos.

Teniendo en cuenta estos tres puntos, es difícil pensar en una buena razón para usar en lugar de retaincopy para sus propiedades NSString.

+0

también se podría usar 'assign'! ;) – justin

-2

se debe utilizar el valor conservan en este caso. La razón de esto es que 1. usted no desea que el objeto que se cancela la asignación 2. que es más probable va a querer cambiar el valor de la NSString en algún momento

Usando el atributo copia está diciendo básicamente que el valor de su NSString no debería cambiar sin previo aviso. es decir, detendrá el valor de NSString que se establece y recupera al mismo tiempo.

Para esta implementación, debe usar retener, o al menos eso es lo que yo entiendo. Para obtener más vistazo aquí: http://cocoawithlove.com/2010/06/assign-retain-copy-pitfalls-in-obj-c.html

0

Se puede utilizar cualquiera, En ambos casos que habrá propietario de los objetos y la necesidad de ser lanzado en dealloc.

Diferencia entre copy y retain.

conservar: -> Simplemente aumenta el conteo de retención en el objeto existente.

copia: -> caja que el nuevo objeto de su propiedad

En ambos casos: que tendrá la propiedad de los objetos.

Leer Apple memory management concept.

@ Noel Broch: A partir de la documentación de Apple

Se toma la propiedad de un objeto si crea empleando un método cuyo nombre comienza con “alloc”, “nuevo”, “copia”, o "mutableCopy" (por ejemplo, alloc, newObject o mutableCopy), o si envía un mensaje de retención.

+0

@Jhaliya El hecho de que retenga un objeto no significa que se convierta en el propietario. Como @Caleb señala que no hay forma de que esté protegido contra alguien enviándole un NSMutableString y cambiando eso más adelante. –

+0

@Claus Broch: Entonces, díganos ... ¿por qué usamos retener? – Jhaliya

+0

@Jhaliya Obtener nuestra propia referencia a un objeto, garantizando así que no se desasigna cuando todos los demás pierden interés en él –

3

También puede usar copy en lugar de retener. Yo uso copy para NSString. Hay una buena discusión sobre este tema. Aquí hay una publicación de stackoverflow NSString Copy or Retain?

4

prefiera copy. no importa si su clase es o no es un singleton.

escribí una explicación bastante largo para esto, que detalla los tipos mutables e inmutables aquí: NSMutableString as retain/copy