ios - Objetivo C-Asignar, copiar, retener
objective-c macos (4)
Soy nuevo en Objective C. Tengo conocimientos básicos en C, incluido el concepto de punteros. Tengo dos preguntas básicas:
- ¿Alguien puede explicar la diferencia entre asignar, copiar y retener con alguna analogía?
- ¿Cómo se maneja una función que devuelve la variable de puntero y cómo se realiza la mensajería a través de un puntero de retorno?
asignar
- Asignar es un atributo de propiedad predeterminado
- assign es un atributo de propiedad que le dice al compilador cómo sintetizar la implementación del setter de la propiedad
dupdo:
- se requiere copia cuando el objeto es mutable
- copy devuelve un objeto que debe liberar explícitamente (por ejemplo, en dealloc) en entornos no recolectados
- debe liberar el objeto cuando haya terminado porque está reteniendo la copia
conservar:
- especifica que el nuevo valor debe enviarse "-retain" en la asignación y el antiguo valor enviado "-release"
- si escribes retener, funcionará automáticamente como fuerte
- Los métodos como "alloc" incluyen un "retener" implícito
La Guía de programación de administración de memoria de la Biblioteca de referencia de iOS tiene los conceptos básicos de asignación, copia y retención con analogías y ejemplos.
copy Hace una copia de un objeto y lo devuelve con el número de retención de 1. Si copia un objeto, es el propietario de la copia. Esto se aplica a cualquier método que contenga la palabra copiar donde "copia" se refiere al objeto que se devuelve.
retener Aumenta el recuento de retención de un objeto en 1. Asume la propiedad de un objeto.
release Disminuye el conteo retenido de un objeto en 1. Renuncia a la propiedad de un objeto.
Respuesta actualizada para la documentación modificada
La información ahora está distribuida en varias guías en la documentación. Aquí hay una lista de lectura obligatoria:
- Competencias principales de Cocoa: propiedad declarada
- Programación con Objective-C: encapsulando datos
- Transición a las notas de la versión de ARC
- Guía de programación avanzada de administración de memoria
- Guía de programación de tiempo de ejecución de Objective-C: Propiedades declaradas
La respuesta a esta pregunta ahora depende completamente de si está usando una aplicación administrada por ARC (el valor predeterminado moderno para nuevos proyectos) o forzando la administración manual de la memoria.
Asignar frente a débil : use asignar para establecer el puntero de una propiedad a la dirección del objeto sin retenerlo o de otro modo curarlo; use weak para hacer que la propiedad apunte a nil automáticamente si el objeto asignado se desasigna. En la mayoría de los casos, querrá usar weak para no intentar acceder a un objeto desasignado (acceso ilegal a una dirección de memoria - " EXC_BAD_ACCESS
") si no realiza la limpieza adecuada.
Conservar frente a copia : las propiedades declaradas usan retener de forma predeterminada (por lo que puede omitirlo por completo) y administrará el recuento de referencia del objeto automáticamente si se asigna otro objeto a la propiedad o si se establece en nulo; Use copy para enviar automáticamente el objeto recién asignado un mensaje -copy
(que creará una copia del objeto pasado y asignará esa copia a la propiedad en su lugar; útil (incluso requerido) en algunas situaciones donde el objeto asignado puede ser modificado después de ser establecer como una propiedad de algún otro objeto (lo que significaría que la modificación / mutación se aplicaría a la propiedad también).
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];
[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];
NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);
array = (
First,
Second,
"Retained Third"
)
Retained Array = (
First,
Second,
"Retained Third"
)
Copied Array = (
First,
Second,
"Copied Third"
)