¿Hay alguna buena regla para aprender cuándo debería usar retener y cuándo asignar?¿Cómo puedo saber si necesito conservar o asignar una propiedad?
Respuesta
Creo que al trabajar con objetos casi siempre se usa retener en lugar de asignar y cuando se trabaja con tipos primitivos, estructuras, etc., se utiliza la asignación (ya que no se pueden retener objetos). Eso es porque quiere que el objeto con la propiedad decida cuándo se hace con el objeto, no con otra cosa. La Guía de administración de memoria de Apple indica esto:
Hay ocasiones en que no desea que se elimine un objeto recibido ; para el ejemplo , puede que necesite almacenar en caché el objeto en una variable de instancia. En este caso, solo usted sabe cuando el objeto ya no es necesario, por lo que necesita la energía para asegurar que el objeto no se deseche mientras usted todavía lo está utilizando. Esto se hace con un mensaje de retención , que conserva el efecto de una liberación automática pendiente (o sustituye a en un mensaje de liberación posterior o de liberación automática ). Al retener un objeto, , asegúrese de que no será desasignado hasta que haya terminado con él.
Para una discusión sobre el uso de copy vs retain, vea this SO question.
Si tiene intención de conservar el objeto y usarlo, utilice retener. De lo contrario, puede ser liberado y terminarás con errores con tu código.
Asignar es para valores primitivos como BOOL, NSInteger o doble. Para los objetos, use retener o copiar, dependiendo de si desea mantener una referencia al objeto original o hacer una copia del mismo.
La única excepción común son las referencias débiles, donde desea mantener un puntero a un objeto pero no puede retenerlo debido a los ciclos de referencia. Un ejemplo de esto es el patrón delegado, donde un objeto (por ejemplo, una vista de tabla) mantiene un puntero a su delegado. Como el objeto delegado conserva la vista de tabla, tener la vista de tabla retener al delegado significaría que nunca se lanzará ninguno. En su lugar, se utiliza una referencia débil en este caso. En esta situación, usaría asignar cuando crea su propiedad.
Sé que esta era una vieja pregunta, pero encontré estas directrices del uber guru Matt Gallagher, súper útil: http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html. En mi caso, tuve un "infierno" de mi propia creación por tener una referencia difícil a un objeto principal.
- 1. ¿Cómo puedo saber si una propiedad es una colección genérica?
- 2. iOS: ¿Cómo puedo saber si una propiedad cumple con KVO?
- 3. Propiedad NSArray: ¿copiar o conservar?
- 4. ¿Cómo puedo asignar una propiedad a un objeto jQuery?
- 5. ¿Cómo saber si una propiedad es una propiedad implementada automáticamente con reflexión?
- 6. cómo saber si una propiedad existe y es falsa
- 7. Objeto dinámico: cómo saber si una propiedad está definida?
- 8. En C#, ¿cómo puedo saber si una propiedad es estática? (.Net CF 2.0)
- 9. ¿Cómo puedo saber si NSTimer está activo o no?
- 10. ¿Cómo puedo saber si un MotionEvent es relativo o absoluto?
- 11. ¿Cómo puedo saber si una tabla es una matriz?
- 12. ¿Cómo puedo saber si un objeto javascript es una imagen o un lienzo?
- 13. ¿Cómo puedo saber si una impresora imprimirá en un archivo?
- 14. ¿Cómo puedo saber si hay una página de php si alguien llegó por POST o GET?
- 15. Cómo puedo asignar una función o propiedad a todas las otras clases como información sobre herramientas
- 16. ¿Cómo puedo saber si una propiedad de clase tiene un conjunto público (.NET)?
- 17. ¿Cómo puedo saber si un elemento contiene una clase específica?
- 18. ¿Cómo puedo saber si una variable de python es una cadena o una lista?
- 19. cómo saber si una variable de JavaScript es una función
- 20. ¿Cómo puedo saber si una variable VARCHAR contiene una subcadena?
- 21. cómo saber si una cadena es base64 o no
- 22. ¿Cómo puedo saber si una lista tiene un tercer artículo?
- 23. ¿Cómo puedo saber si existe una RenderSection no requerida?
- 24. ¿Cómo puedo saber si un proceso tiene una interfaz gráfica?
- 25. ¿Cómo asignar propiedad personalizada al objeto jQuery?
- 26. En Linux, ¿cómo puedo saber si estoy enlazando a una biblioteca estática o dinámica?
- 27. ¿Cómo puedo saber si NumPy crea una vista o una copia?
- 28. ¿Cómo puedo saber si estoy antes de guardar desde una edición o una creación? CakePHP
- 29. ¿Cómo puedo saber si Windows entra o sale del modo de suspensión o Hibernación?
- 30. ¿Cómo puedo saber si un hWnd determinado sigue siendo válido?
Excelente respuesta a continuación. Sería genial si pudiera marcar uno como aceptado. – memmons