La memory de la aplicación IPhone sigue creciendo

Estaba todo listo para enviar mi primera aplicación a la tienda de aplicaciones. Comprobado por fugas, probado en dispositivos, los trabajos. Quería asegurarme de que mi memory estuviera bajo control, así que ejecuté asignaciones y, por desgracia, nada estaba bajo control.

He probado varias áreas de mi aplicación, pero me concentré en un par de áreas grandes donde el uso continuo por parte del usuario podría hacer que la memory se salga de control muy fácilmente. Para mí, la información de Allocations / Heapshots es difícil de leer, así que espero que alguien por ahí pueda hacer esto para Rosetta Stone.

Intentaré dar tantos detalles como sea posible, y si no es suficiente, solo gritaré y escribiré más.

La aplicación comienza en un menu. Al hacer clic en un button se abre una vista, a través de presentModalViewController. La vista aparece y, en segundo plano, se abre una database y se selecciona y almacena una fila aleatoria. Por lo tanto, el ciclo de: Hacer clic en Menú principal-> Abrir vista-> Cerrar vista hace que mi memory crezca a una velocidad de 10KB-25KB cada vez.

Algunos pensamientos:

  • Algunas partes de mi vista se crean a través de IB, algunos de los botones son files .png personalizados. Leí que una compilation anterior tenía problemas para liberar y reasignar estos resources que causaban pérdidas de memory.
  • He estado usando button.layer.borderWidth / borderColor / cornerRadius / backgroundColor con algunos de mis botones que fueron creados originalmente en IB. ¿Esto es un no-no? (Quitarlos ayuda un poco, pero el problema sigue apareciendo).

Para los curiosos, esta es la stack de llamadas para el mayor crecimiento del montón:

0 libSystem.B.dylib calloc 1 CoreGraphics CGGlyphBitmapCreate 2 CoreGraphics CGFontCreateGlyphBitmap8 3 CoreGraphics CGFontCreateGlyphBitmap 4 CoreGraphics CGGlyphLockLockGlyphBitmaps 5 libRIP.A.dylib ripc_DrawGlyphs 6 CoreGraphics draw_glyphs 7 CoreGraphics CGContextShowGlyphsWithAdvances 8 WebCore WebCore::showGlyphsWithAdvances(WebCore::FloatPoint const&, WebCore::SimpleFontData const*, CGContext*, unsigned short const*, CGSize const*, unsigned long) 9 WebCore WebCore::Font::drawGlyphs(WebCore::GraphicsContext*, WebCore::SimpleFontData const*, WebCore::GlyphBuffer const&, int, int, WebCore::FloatPoint const&, bool) const 10 WebCore WebCore::Font::drawSimpleText(WebCore::GraphicsContext*, WebCore::TextRun const&, WebCore::FloatPoint const&, int, int) const 11 WebCore WebCore::Font::drawText(WebCore::GraphicsContext*, WebCore::TextRun const&, WebCore::FloatPoint const&, int, int) const 12 WebKit drawAtPoint(unsigned short const*, int, WebCore::FloatPoint const&, WebCore::Font const&, WebCore::GraphicsContext*, bool, WebCore::BidiStatus*, int) 13 WebKit -[NSString(WebStringDrawing) __web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:measureOnly:rendenetworkingStringOut:drawUnderline:] 14 WebKit -[NSString(WebStringDrawing) __web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:measureOnly:rendenetworkingStringOut:] 15 WebKit -[NSString(WebStringDrawing) __web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:measureOnly:] 16 WebKit -[NSString(WebStringDrawing) _web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:] 17 UIKit -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:lineBreakMode:letterSpacing:includeEmoji:] 18 UIKit -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:includeEmoji:] 19 UIKit -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:] 20 UIKit -[UILabel _drawTextInRect:baselineCalculationOnly:] 21 UIKit -[UILabel drawTextInRect:] 22 UIKit -[UILabel drawRect:] 23 UIKit -[UIView(CALayerDelegate) drawLayer:inContext:] 24 QuartzCore -[CALayer drawInContext:] 25 QuartzCore backing_callback(CGContext*, void*) 26 QuartzCore CABackingStoreUpdate_ 27 QuartzCore CA::Layer::display_() 28 QuartzCore -[CALayer _display] 29 QuartzCore CA::Layer::display() 30 QuartzCore -[CALayer display] 31 QuartzCore CA::Layer::display_if_needed(CA::Transaction*) 32 QuartzCore CA::Context::commit_transaction(CA::Transaction*) 33 QuartzCore CA::Transaction::commit() 34 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) 35 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 36 CoreFoundation __CFRunLoopDoObservers 37 CoreFoundation __CFRunLoopRun 38 CoreFoundation CFRunLoopRunSpecific 39 CoreFoundation CFRunLoopRunInMode 40 GraphicsServices GSEventRunModal 41 GraphicsServices GSEventRun 42 UIKit UIApplicationMain 43 GRE Words main /Users/admin/Dropbox/GRE Words/main.m:14 44 GRE Words start 

Si crees que bits de código te ayudarán, avísame. Sentí que estaba avanzando y esto ha sido bastante descorazonador.

Gracias.

Use Heapshot para encontrar la creación de memory, consulte: blog de bbum

Básicamente, el método consiste en ejecutar la herramienta de asignación de instrumentos, tomar un montón, ejecutar una intuición del código y otro montón repitiendo 3 o 4 veces. Esto indicará la memory asignada y no liberada durante las iteraciones.

Para averiguar los resultados divulgar para ver las asignaciones individuales.

Si necesita ver dónde se conserva, las liberaciones y autorelease se producen para un object, utilizan los instrumentos:

Ejecutar en instrumentos, en Asignaciones establecidas "Grabar counts de reference" en activado (debe detener la grabación para configurar la opción). Haga que el selector se ejecute, detenga la grabación, busque allí ivar (datePickerView), profundice y podrá ver dónde se saveon todos, las liberaciones y las autorelease.

Utilicé esto muchas veces y realmente me ayudó, buena suerte.