Si utilizo una categoría que usa objc_setAssociatedObject
para agregar pseudo-propiedades a un objeto, ¿cómo puedo asegurarme de que se liberen correctamente? ¿Debo liberarlos manualmente en dealloc
?¿Cómo liberar objetos asociados a través de objc_setAssociatedObject?
Respuesta
El comportamiento que asigna determina cómo se gestiona la memoria para el tipo. Si elige retener o copiar, el objeto se liberará cuando se desasigne la instancia de la clase a la que agrega la referencia asociada. Eso hace que se retengan y copien las operaciones de comportamiento preferidas para las clases Objective-C. Asignar también es útil para evitar retener ciclos siempre que establezca la referencia en cero cuando se hace con el objeto.
Constantes
OBJC_ASSOCIATION_ASSIGN Especifica una referencia débil para el objeto asociado .
OBJC_ASSOCIATION_RETAIN_NONATOMIC Especifica una fuerte referencia al objeto asociado, y no que la asociación es hizo atómicamente.
OBJC_ASSOCIATION_COPY_NONATOMIC Especifica que el objeto asociado se copia, y que la asociación no se hace atómicamente.
OBJC_ASSOCIATION_RETAIN Especifica una referencia fuerte a del objeto asociado, y que la asociación se realiza atómicamente.
OBJC_ASSOCIATION_COPY Especifica que el objeto asociado se copia, y que la asociación se realiza atómicamente.
A pesar de que respondió a su propia pregunta, todavía, ya que no incluyó el texto mismo docs, y la página se ha vinculado a ya no está disponible, aquí es para la conveniencia de los demás:
De Objective-C de tiempo de ejecución de referencia
void objc_removeAssociatedObjects(id object)
de apple Elimina todas las asociaciones para un objeto dado.
El objetivo principal de esta función es hacer que sea fácil para devolver un objeto a un "estado original”. Usted no debe usar esta función para la eliminación general de las asociaciones de objetos, ya que también elimina asociaciones que otra los clientes pueden haber añadido al objeto. Normalmente, usted debe utilizar
objc_setAssociatedObject
con un valor de cero a clara una asociación.
- 1. Cómo obtener objetos GDI asociados a un proceso
- 2. ¿Debo liberar estos objetos?
- 3. Validar máxima cantidad af objetos asociados
- 4. Cómo liberar objetos COM en Silverlight 4
- 5. ¿Cómo puedo liberar objetos en C#
- 6. Buscar todos los objetos sin objetos has_many asociados
- 7. Objc_setAssociatedObject no disponible en el simulador de iPhone
- 8. ¿Cómo puedo definir varios objetos asociados usando Factory Girl?
- 9. Liberar texturas (objetos GLKTextureInfo) asignados por GLKTextureLoader
- 10. ¿Desea liberar una propiedad UIImage cargada a través de imageNamed?
- 11. Iteración a través de objetos en JsonCpp
- 12. ¿Cómo liberar memoria?
- 13. Loop A través de objetos en Javascript
- 14. Django: accediendo a muchos a muchos objetos a través de otra relación Muchos a Muchos
- 15. ¿Cómo se itera a través de una lista de objetos?
- 16. estrategia para asignar/liberar lotes de objetos pequeños
- 17. Cómo iterar a través de objetos anidados en JS
- 18. Cómo iterar a través de todos los objetos Bundle
- 19. ¿Cómo enviar objetos a través de NamedPipe en .NET 3.5?
- 20. Valide que un objeto tenga uno o más objetos asociados
- 21. Autorelease frente a liberar
- 22. Manipular con punteros a objetos de clases derivadas a través de punteros a clase base objetos
- 23. Cómo ordenar un NSMutableArray de Objetos gestionados a través de un gráfico de objetos
- 24. ¿Cómo uso objc_setAssociatedObject/objc_getAssociatedObject dentro de un objeto?
- 25. Rails 3 encuentra todos los registros asociados has_many: a través de
- 26. Iterar a través de objetos anidados de JavaScript
- 27. ¿Cómo liberar una interfaz?
- 28. ¿Cómo liberar aplicaciones web?
- 29. Cómo liberar un bloque
- 30. ¿Cómo liberar memoria de std :: deque?
Eso fue rápido :) pero no es la respuesta que estaba buscando. debería tener sido más específico en mi pregunta, sry. – radiospiel
@ra Dije que si Diospiel arriba, retenga o copie liberará el objeto para usted "el objeto será liberado cuando se publique la clase a la que agrega la referencia asociada" – Joe
@JoshCaswell Gracias, ese sería el término correcto. – Joe