tutorial smart remix español curso aprender objective-c properties copy nsarray retain

objective-c - smart - solidity español



Propiedad NSArray: copiar o retener? (4)

Desde el enlace que incluyó, prácticamente se reduce a esto: Propiedad NSString: ¿copiar o retener?

Si desea asegurarse de que el valor del objeto no cambie durante la ejecución, use el atributo de copy , de lo contrario, retain estará bien. En general, retain estará bien para NSMutableArrays y NSArrays (así como para muchos otros objetos), ya que (por lo general) está más interesado en el objeto que en el valor que contiene. En el caso de una NSString , siempre está interesado en el valor, así que copy para asegurarse de que no cambie.

@jlehr:

Depende si el desarrollador está interesado en el valor real o no. Cuando esté interesado en el valor real, utilice copiar (ya que no desea que el valor cambie durante la ejecución), de lo contrario, retener está bien. De los documentos de Apple:

Es una práctica común en el código Objective-C copiar objetos de valor, objetos que representan atributos. Las variables de tipo C generalmente se pueden sustituir por objetos de valor, pero los objetos de valor tienen la ventaja de encapsular utilidades convenientes para manipulaciones comunes. Por ejemplo, se utilizan objetos NSString en lugar de punteros de caracteres porque encapsulan la codificación y el almacenamiento.

También de los documentos de Apple, sobre el tema de los objetos de valor:

Un objeto de valor es en esencia un envoltorio orientado a objetos para un elemento de datos simple como una cadena, un número o una fecha. Las clases de valor común en Cocoa son NSString, NSDate y NSNumber. Los objetos de valor son a menudo atributos de otros objetos personalizados que creas.

De acuerdo con esto: propiedad de NSString: copiar o retener?

Para NSString / NSMutableString, se recomienda copiar.

¿Qué hay de NSArray / NSMutableArray?


Si es un problema cuando cambian los datos subyacentes, utilice copiar . De hecho, esto es lo que desea la mayoría de las veces, ya que cambiar los datos detrás de la espalda de alguien es una buena fuente de errores.

Tenga en cuenta que la copia esencialmente será solo una retención para un NSArray. Solo cuando lanzas un NSMutableArray, hay más trabajo involucrado.


Ya que está preguntando acerca de NSArray (en lugar de NSMutableArray), debe usar copiar. NSArray es inmutable, por lo que no espera que cambie una propiedad de ese tipo. Pero NSMutableArray es una subclase de NSArray, por lo que es perfectamente válido que alguien pase un NSMutableArray. Si solo retienes ese objeto, entonces puede cambiar justo debajo de tu nariz. Si copia en lugar de retener, entonces el objeto no cambiará.

Sin embargo , debe tener en cuenta que cuando copia un contenedor como NSArray, solo está copiando el contenedor y no su contenido. Si la matriz contiene objetos mutables, el contenido de esos objetos puede cambiar aunque la matriz en sí sea inmutable.


elija copy , a menos que tenga una razón muy específica para no hacerlo, así como todo el código / interfaz de respaldo para respaldar eso.

Detallé las razones y varias implicaciones aquí: NSMutableString como retener / copiar

ese ejemplo se basa en NSString s, pero lo mismo se aplica para NSArray s.