2010-11-10 687 views
6

Tengo una aplicación que estoy escribiendo que se cuelga cuando llamo addSubview en un UIScrollView con "EXC_BAD_ACCESS". Solo hace esto en iPhone 3G en modo de lanzamiento y solo en el dispositivo. Me funciona bien en todas estas otras configuraciones:La aplicación iPhone se bloquea solo en el modo de lanzamiento en 3G

iPhone 3G - El modo de depuración iPhone 3GS - depuración y modo de lanzamiento iPhone 4 - depuración y modo de lanzamiento Simulador - todos.

Además, no hay una razón racional para que esto suceda. Mi objeto no es liberado por ninguno de mi código.

Respuesta

2

Le recomiendo que use NSZombieEnabled para averiguar qué está causando un mal acceso a la memoria.

  • ¿Utiliza DEBUG/RELEASE define para ramificar su código?
  • ¿Utiliza comprobadores de versión SDK para bifurcar su código?

De lo contrario, no puedo ver cómo su aplicación puede comportarse de manera diferente en diferentes dispositivos/configuraciones.

+0

Tengo NSZombieEnabled pero no funciona en este caso .. Además, no estoy usando ninguna versión de SDK.Hay algunas cosas triviales en mi biblioteca HTTP, pero esto no está relacionado con esta área del código. – whitehawk

+0

¿Qué iOS estás ejecutando en cada uno de esos 3 dispositivos? ¿Tiene una compilación condicional usando DEBUG/RELEASE define? Mencionas que un objeto está desasignado, ¿puedes publicar algo de ese código? –

0

Nunca he "resuelto" esto, pero sí rastreé el código ofensivo. Sospecho que algo en este segmento del código de Quartz estaba causando un desbordamiento del búfer en algún lugar dentro del núcleo, y solo causó un problema en 3G. Algunos de la configuración para este segmento no está incluido pero esto es sin duda donde está ocurriendo:

gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations); 
CGContextAddPath(context, path); 
CGContextSaveGState(context); 
CGContextEOClip(context); 
transform = CGAffineTransformMakeRotation(1.571f); 
tempPath = CGPathCreateMutable(); 
CGPathAddPath(tempPath, &transform, path); 
pathBounds = CGPathGetPathBoundingBox(tempPath); 
point = pathBounds.origin; 
point2 = CGPointMake(CGRectGetMaxX(pathBounds), CGRectGetMinY(pathBounds)); 
transform = CGAffineTransformInvert(transform); 
point = CGPointApplyAffineTransform(point, transform); 
point2 = CGPointApplyAffineTransform(point2, transform); 
CGPathRelease(tempPath); 
CGContextDrawLinearGradient(context, gradient, point, point2, (kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation)); 
CGContextRestoreGState(context); 
CGGradientRelease(gradient); 
0

se dice "Mi objetivo no es liberado por cualquiera de mi código". Descubrí que no es raro que Objective-C se encuentre con situaciones en las que el código no ha liberado explícitamente un objeto, sin embargo, el objeto se ha liberado de todos modos. Por ejemplo, fuera de mi cabeza, digamos que tienes un objeto n. ° 1 con retención de 1 y lo sueltas pero luego lo sueltas automáticamente. Luego, antes de el grupo de autorrelease está realmente agotado, asigna un nuevo objeto # 2 - no es inconcebible que este nuevo objeto # 2 pueda asignarse en la misma dirección que el objeto # 1. Por lo tanto, cuando el grupo de autorrellena se drena posteriormente, liberará el objeto n. ° 2 accidentalmente.

+0

Oye, después de un extenso análisis estático, análisis de rendimiento usando la herramienta de fugas y un análisis minucioso de mi código, estoy bastante seguro de que no es un problema de fuga. Podría estar equivocado, pero he publicado el segmento ofensivo del código anterior. Siéntete libre de echar un vistazo. – whitehawk

1

Puedo proponer cambiar el nivel de optimización de las configuraciones de liberación a "Ninguna". Me encontré con el mismo problema varias veces (con diferentes aplicaciones) y lo resolví de esta manera.

12

Tuve exactamente el mismo problema recientemente, sin embargo, no estoy del todo seguro de que la causa sea la misma. Sin embargo, lo que puedo decirte es qué resolvió el problema para mí (aunque todavía no estoy del todo satisfecho con la solución).

Al final, parece un problema de compilación, y esto podría confirmar lo que otros han dicho sobre la optimización del compilador. Estoy usando Xcode 4.0 (compilación 4A304a). El problema era con LLVM compiler 2.0 Code Generation. Una clave en particular: "Nivel de optimización"

La depuración se configuró en "Ninguno". La versión se configuró en "Más rápido, más pequeño"

Al cambiar la versión a "Ninguno" se corrigió el bloqueo (y el cambio similar de Debug a "Más rápido, más pequeño" causó la falla de la aplicación al iniciarse).

+0

¡esta es la respuesta para mí! ¡muchas gracias! – datayeah

Cuestiones relacionadas