2010-11-10 11 views
6

Ho un'app che sto scrivendo che si arresta in modo anomalo quando chiamo addSubview su un UIScrollView con "EXC_BAD_ACCESS". Lo fa solo su iPhone 3G in modalità di rilascio e solo sul dispositivo. Ho funziona bene in tutte queste altre configurazioni:L'app per iPhone si blocca solo in modalità di rilascio su 3G

iPhone 3G - modalità debug iPhone 3GS - debug e modalità di uscita iPhone 4 - debug e modalità di uscita Simulator - tutti.

Inoltre, non vi è alcun motivo razionale per cui ciò dovrebbe accadere. Il mio oggetto non è rilasciato da nessuno dei miei codici.

risposta

2

Si consiglia di utilizzare NSZombieEnabled per scoprire cosa causa un cattivo accesso alla memoria.

  • Si utilizza DEBUG/RELEASE per eseguire il branching del codice?
  • Utilizzate i correttori di versione dell'SDK per suddividere il vostro codice?

Altrimenti non riesco a vedere come la tua app può comportarsi diversamente su diversi dispositivi/configurazioni.

+0

Ho NSZombieEnabled ma non funziona in questo caso. Inoltre, non sto usando alcun correttore di versione dell'SDK.C'è qualcosa di banale nella mia libreria HTTP ma questo non è legato a quest'area del codice. – whitehawk

+0

Quali iOS stai utilizzando su ciascuno di questi 3 dispositivi? Avete una compilazione condizionale usando DEBUG/RELEASE? Hai menzionato un oggetto che è stato deallocato, puoi pubblicare un po 'di quel codice? –

0

Non ho mai "risolto" questo, ma ho rintracciato il codice incriminato. Sospetto che qualcosa in questo segmento del codice Quartz stia causando un sovraccarico del buffer da qualche parte nel profondo del core - e ha causato solo un problema sul 3G. Alcuni dei setup per questo segmento non è incluso, ma questo è sicuramente dove sta accadendo:

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

si dice "mio oggetto non viene rilasciato da uno dei mio codice". Ho scoperto che non è raro in Objective-C imbattersi in situazioni in cui il codice non ha rilasciato esplicitamente un oggetto, ma l'oggetto è stato rilasciato lo stesso. Ad esempio, in cima alla mia testa, diciamo che hai un oggetto n. 1 con numero di ritenzione pari a 1 e lo rilasci ma poi lo fai automaticamente per accidentalmente. Quindi, prima del il pool di autorelease è effettivamente esaurito, si assegna un nuovo oggetto n. 2 - non è inconcepibile che questo nuovo oggetto n. 2 possa essere assegnato allo stesso indirizzo dell'oggetto n. 1. Quindi, quando il pool di autorelease viene successivamente svuotato, rilascerà l'oggetto n. 2 accidentalmente.

+0

Ehi, dopo un'estesa analisi statica, analisi delle prestazioni utilizzando lo strumento di perdita e controllo del mio codice, sono diventato abbastanza fiducioso che questo non è un problema di perdite. Potrei sbagliarmi ma ho pubblicato il segmento di codice offendente di cui sopra. Sentiti libero di dare un'occhiata. – whitehawk

1

Posso proporre di modificare il livello di ottimizzazione delle impostazioni di rilascio su "Nessuno". Ho incontrato lo stesso problema alcune volte (con diverse app) e l'ho risolto in questo modo.

12

Ho avuto lo stesso identico problema di recente, tuttavia non sono del tutto sicuro che la causa sia la stessa. Quello che posso dirti è quello che ha risolto il problema per me (anche se non sono ancora completamente soddisfatto della soluzione).

Alla fine, sembra un problema del compilatore e ciò potrebbe confermare ciò che altri hanno detto sull'ottimizzazione del compilatore. Sto usando Xcode 4.0 (build 4A304a). Il problema era con la generazione del codice del compilatore 2.0 LLVM. Una chiave in particolare: "Livello di ottimizzazione"

Il debug era impostato su "Nessuno". Il rilascio è stato impostato su "Più veloce, Più piccolo"

Cambiare Release in "Nessuno" ha risolto l'arresto anomalo e, modificando in modo analogo Debug in "Più veloce, Più piccolo", l'app si arrestava in modo anomalo all'avvio.

+0

questa è la risposta per me! molte grazie! – datayeah

Problemi correlati