Pregunta

He estado aprendiendo a desarrollar aplicaciones en la plataforma de cocoa touch. He recorrido un largo camino, pero una parte que no puedo entender es la administración de la memoria.

Pensé que tomaría una ruta de comparación en lugar de intentar comenzar desde cero. No puedo encontrar mucha diferencia entre CLR (.net) y Objective-C 2.0, por lo que me pregunto si la comunidad de desbordamiento de pila puede ayudarme con esta pregunta.

¿Cuáles son las diferencias clave / importantes en la gestión de memoria entre Objective-C 2.0 y CLR? Con respecto a Objective-C 2.0, estoy desarrollando el iPhone OS y la funcionalidad de liberación automática no está recomendada.

Supongo que estoy buscando una comparación de los dos ... Dado que vengo de un fondo .NET, ¿qué podrían ser cosas que necesito saber sobre la administración de memoria de Objective-C 2.0?

¡Gracias a todos!

¿Fue útil?

Solución

El CLR se ejecuta en una máquina virtual; el sistema de recolección de basura maneja toda la desasignación de objetos. En general, en la memoria de Objective-C se debe administrar manualmente a través del antiguo malloc / estilo de C o mediante el sistema de conteo de referencia de retener / liberar. Si vienes de un estándar " C " De fondo, la técnica no parecerá demasiado extraña.

Con el recuento de referencias, el sistema cuenta cuántas veces se usa un objeto específico; esto es básicamente el '' retener '' mencionado anteriormente. Cuando se hace algo con un objeto, el objeto se envía manualmente un " release " mensaje que disminuye el recuento de retención del objeto en 1. Cuando el recuento llega a 0, el sistema desasigna automáticamente el objeto. Esto parecerá extremadamente engorroso en comparación con CLR / .NET, pero ese mecanismo proporciona un mejor rendimiento y más control.

Si está codificando en Objective-C 2.0 en Macintosh, tiene suerte ya que la recolección de basura se puede habilitar a través de una opción en XCode. Esto estará más cerca de lo que proporciona el CLR. Si está desarrollando en el iPhone, la recolección de basura cuesta demasiado en términos de memoria y CPU, por lo que no es una opción. La memoria debe administrarse manualmente.

Afortunadamente, hay una opción intermedia que se usa comúnmente mediante el envío y la "liberación automática". mensaje a un objeto. Este mecanismo, incluido tanto en Macintosh como en iPhone, básicamente agrupa los objetos asignados en un diccionario global (en realidad se llama un grupo de liberación automática). Cuando existe la aplicación o cuando se agota el grupo, los objetos se desasignan. Sin embargo, no todo entra en el grupo de liberación automática ni desea poner todo allí. Recomiendo la lectura seca pero importante del lenguaje de programación Objective-C 2.0 del sitio de Apple que entra en más detalles.

http://developer.apple.com/documentation /Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

Buena suerte y paciencia. Objective-C no es un chico nuevo en el bloque como .Net (tiene más de 25 años), pero tiene algunas características increíbles que .Net acaba de comenzar a incorporar.

Otros consejos

En el iPhone es manual. Si asigna o conserva memoria, debe liberarla.

En el .NET CLR no te importa cómo es la memoria o qué objeto hace con ella en su mayor parte.

Para el iPhone, debe equilibrar cada asignación de objetos, iniciar o retener con una versión. Como el iPhone usa un mecanismo de conteo de referencia simple, una vez que el conteo cae a 0, el objeto se limpiará.

Una cosa a la que necesitaba acostumbrarme es que puedes tener una propiedad que se retiene automáticamente, por lo que si creas un objeto y luego lo asignas a la propiedad, tendrá un conteo de 2. Lo que funciona mejor es crear el objetar a una variable temporal asignar a la propiedad, luego liberar la variable temporal para obtener una cuenta regresiva de hasta 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top