Punto de interrupción que indica "objc_autoreleaseNoPool"

Así que estoy depurando una aplicación en preparación para su aplicación para su publicación, y he habilitado un punto de interrupción universal para "Todas las excepciones". Desde entonces, cada vez que ejecuto la aplicación, la console imprime:

Catchpoint 2 (tiro) Punto de interrupción pendiente 1: "objc_exception_throw" se resolvió

objc [11765]: object 0x8f18ff0 de la class __NSCFLocale autoreleased sin grupo en el lugar – solo fugas – break en objc_autoreleaseNoPool () para depurar

objc [11765]: object 0x8f190a0 de la class __NSCFNumber autoreleased sin grupo en el lugar – solo fugas – break en objc_autoreleaseNoPool () para depurar

objc [11765]: object 0x8f1fef0 de la class __NSCFLocale autoreleased sin grupo en el lugar – solo fugas – break en objc_autoreleaseNoPool () para depurar

Literalmente impreso 3 veces. No tengo idea de qué significa esto pero se ve mal. Cualquier consejo sería apreciado.

    Nueva información

    Determiné dónde se encuentra mi problema mediante la creación de un método de autorrelleno swizzled.

    No recomiendo hacer eso a less que sepa lo que está haciendo, sin embargo esto es lo que descubrí.

    + (void) load; //Method is called outside the original autorelease pool. + (void) initialize; // Method is called outside the original autorelease pool. 

    NSThread crea su propio hilo, el método llamado debe envolverse en un grupo de autorelease.

    Grand Central Dispatch se encarga de adaptarse sobre el set de autorelease cuando utiliza los commands "despatch _…". Sin embargo, cuando envíe manualmente. es posible que desee envolverlo en un grupo de autorelease.

    Además, ARC no maneja informándole que una autorización automática sucederá fuera de un grupo.

    Por lo tanto, si está utilizando ARC y sabe que estará fuera del grupo de autorelease. Y no hay nada que puedas hacer al respecto. Deseará evitar todos los methods de conveniencia.

    utilizar esta.

     [[NSString alloc] initWithFormat:@"%@",myObject]; 

    en lugar de esto

     [NSString stringWithFormat:@"%@",myObject]; 

    esto permitirá que el sistema de arco se retenga y se libere, pero se omitirá el autoelemento subyacente realizado por el método de conveniencia ya que no habrá utilizado el método de conveniencia.

    Espero que ayude.

    Respuesta original

    Ok, no siento que esta pregunta fue respondida con suficiente detalle.

    El post que se presentó fue

     objc[1310]: Object 0x34f720 of class SimpleKeychain autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

    El depurador está señalando un posible punto de ruptura que lo ayudará a depurar la situación. Ahora, mientras que este punto de ruptura realmente hizo poco para ayudar a depurar la situación. Creo que es importante saber cómo agregar ese punto de interrupción al depurador, así que pasé el time jugando con él (después de recorrer Internet y no encontrar nada) hasta que logré romper ese error.

    Es un poco molesto que romper todos los errores no capte esto, pero aquí están los pasos para agregar el punto de interrupción al depurador.

    Lo primero que quiere hacer es seleccionar el browser de punto de interrupción del depurador

    barra de herramientas del navegador

    haciendo clic en esta pestaña

    botón de punto de interrupción

    Luego, mira hacia la parte inferior del panel del browser y presiona el button Más.

    Agregar punto de interrupción de excepción

    Esto le permitirá agregar manualmente un punto de interrupción.

    Seleccioné un punto de interrupción de C ++ e ingresé el nombre del post en el campo de text del nombre.

    Agregando una excepción personalizada de C ++

    después de agregar esta exception, realmente se rompió.

    Sin embargo, esto puede o no ser útil para usted como desarrollador objective c. Esto rompió con el código de la Asamblea.

    código de ensamblaje en punto de corte logrado.

    Desafortunadamente solo mostró este punto en la stack de llamadas para el hilo.

    Lista de hilos

    Y resultó que el problema de autorelease se debía a que una class llamada autorelease en una llamada dispatch_once. y una mayor investigación reveló que la carga + (vacío); El método en la class fue llamado antes que nada. esto se hace a través de la function call_load_methods y está fuera del hilo en el método principal.

    Error de llamada y pila

    para corregir esto, simplemente agregué el contenedor de autorelease alnetworkingedor de la llamada.

    llamada de error actualizada

    otra solución puede ser agregar el pool de autorelease dentro de la carga + (vacío); método. pero esto fue suficiente para mis usos.

    NOTA: Estoy agregando esto a la publicación aquí porque no me gusta encontrar un problema y no poder encontrar todos los paths a la respuesta resultante. Si el depurador le dice que agregue un punto de interrupción a la function enumerada, entonces debería haber algo de información en alguna parte para get esa información. Con suerte, esto networkingucirá la frustración de algunos de los que están tratando de encontrar esta respuesta.

    Muchos de los methods en el cocoa api devuelven objects autoelegidos. En particular, aquellos methods que devuelven un object que no comienza con init , como [NSNumber numberWithLong:] . Si no tiene una agrupación autorelease en su lugar, esos objects se filtrarán. Puede encontrar más información sobre el uso de NSAutoreleasePool en la documentation .

    Significa que necesita crear un grupo de autorelease en el hilo que sucede. De lo contrario, sus objects asignados no serán destruidos (como sugiere el post). Entonces, pausa / pausa en el símbolo, luego sube la stack a tu input de subprocess (o progtwig) y agrega una agrupación autorelease. Eso es todo.