2011-01-22 16 views
8

Mi estructura de aplicación es la siguiente, la parte del núcleo está escrita en C++ y usando thread fuertemente, y estoy desarrollando UI en Objective C en la parte superior, si no ejecuto el hilo funciona bien, pero no se puede desactivar, detener hilo, la interfaz de usuario se bloquea al azar en el registro que pude ver, siguiente mensaje¿Qué significa "Autoreleased with no pool in place"?

__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking 

mensajes similares que vienen más de una vez, por google llegado a saber, i necesidad de establecer NSAutoreleasePool para deshacerse de ello, pero cómo es posible integrar lo mismo con el código C++.

Editar: lib Core se puede activar desde la interfaz de usuario, por lo tanto, supongo, es seguro decir que la interfaz de usuario se ejecuta en el hilo principal, Lib es la creación/terminación de hilo sin notificar a la interfaz de usuario, en este caso, puedo llamar AutoReleasePool en la interfaz de usuario

¿Alguien me puede guiar?

Respuesta

7

ver a estos documentos para lo que debe saber sobre multihilo con cacao: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

Está bien para diseñar su aplicación como usted tiene, pero hay dos cosas deben tenerse en cuenta:

  1. vida es más simple (y algunas veces es necesario) cuando los controles de UI como las vistas (AppKit o UIKit) se manipulan en el hilo principal. Puede usar objetos Foundation y algunos objetos AppKit/UIKit en hilos de fondo, y algunos objetos Foundation pueden usarse desde múltiples hilos.
  2. Si está utilizando cualquier objeto Cocoa en absoluto en los subprocesos de fondo, deberá configurar pools de liberación automática en esos subprocesos.

así:

- (void)backgroundThreadStart 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // do stuff 

    [pool release]; 
} 

que va a arreglar sus errores de la consola, pero es posible que tenga otros problemas que llevaron a la actual estrellarse que estaban viendo.

+0

Hola, déjame intentar agregar algo más a mi pregunta – Amitg2k12

1

Significa que has liberado algo automáticamente sin un grupo de liberación automática.

Cada subproceso tiene una pila de grupos de autorrelease. En el hilo principal, se crea un grupo de autorrelease antes de que Cocoa llame a su código y se agote una vez que regrese su código. Cada objeto que libera automáticamente (ya sea explícita o implícitamente) va al grupo, para que el grupo lo libere cuando el grupo se agota. Cuando crea un hilo, debe crear y drenar un grupo de autorrelease en ese hilo usted mismo. (O simplemente no AutoRelease nada, pero eso es prácticamente imposible para cualquier cantidad significativa de código.)

Si alguna vez decide ejecutar su código bajo recolección de basura, se tendrá que enviar a la piscina drain, no release, cuando ya terminaste con eso, para que el grupo sea útil. Cuando GC está habilitado, los mensajes release y autorelease no hacen nada, ni siquiera se procesan. Su grupo de autorrelease responderá al drain al tocar el recolector de basura, que es el equivalente más cercano a liberar los objetos que habrían estado en el grupo.

The Memory Management Programming Guide for Cocoa tiene más información acerca de los grupos de autorreleases, entre otras cosas.

Cuestiones relacionadas