tutorial for developer apple objective-c xcode ios-simulator

objective-c - for - xcode tutorial



Todos los puntos de interrupción de excepción se detienen sin motivo en el simulador (7)

Esto es muy molesto, cada vez que intento depurar en el simulador con "todos los puntos de interrupción de excepción", la aplicación se detiene sin razón en esta línea:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([STAppDelegate class]));

¿Alguien más lo encontró luchando con este problema?

¡Gracias!

EDITAR

Traza posterior en el primer lanzamiento:

thread #1: tid = 0x1d96b, 0x36fbf540 libc++abi.dylib`__cxa_throw, queue = ''com.apple.main-thread'', stop reason = breakpoint 3.2 frame #0: 0x36fbf540 libc++abi.dylib`__cxa_throw frame #1: 0x306975cc libFontParser.dylib`TFileDescriptorContext::TFileDescriptorContext(char const*) + 112 frame #2: 0x306973d8 libFontParser.dylib`TFileDataReference::TFileDataReference(char const*) + 164 frame #3: 0x306971fc libFontParser.dylib`TFileDataSurrogate::TFileDataSurrogate(char const*, bool) + 188 frame #4: 0x3069555a libFontParser.dylib`TFont::CreateFontEntitiesForFile(char const*, bool, TSimpleArray<TFont*>&, bool, short, char const*) + 1402 frame #5: 0x30694a80 libFontParser.dylib`FPFontCreateFontsWithPath + 224 frame #6: 0x2a5032bc libCGXType.A.dylib`create_private_data_with_path + 12 frame #7: 0x2a3ca3c4 CoreGraphics`CGFontCreateFontsWithPath + 24 frame #8: 0x2a4855d6 CoreGraphics`CGFontCreateFontsWithURL + 310 frame #9: 0x313dfee4 GraphicsServices`AddFontsFromURLOrPath + 68 frame #10: 0x313e39de GraphicsServices`__Initialize_block_invoke + 934 frame #11: 0x0121fabe libdispatch.dylib`_dispatch_client_callout + 22 frame #12: 0x01220750 libdispatch.dylib`dispatch_once_f + 100 frame #13: 0x313df72c GraphicsServices`Initialize + 196 frame #14: 0x377944c4 libobjc.A.dylib`_class_initialize + 536 frame #15: 0x3779a046 libobjc.A.dylib`lookUpImpOrForward + 254 frame #16: 0x37799f3e libobjc.A.dylib`_class_lookupMethodAndLoadCache3 + 34 frame #17: 0x377a01f8 libobjc.A.dylib`_objc_msgSend_uncached + 24 frame #18: 0x2d673b6e UIKit`-[UIStatusBarNewUIForegroundStyleAttributes makeTextFontForStyle:] + 78 frame #19: 0x2d634d94 UIKit`-[UIStatusBarForegroundStyleAttributes textFontForStyle:] + 104 frame #20: 0x2d5e767e UIKit`-[UIStatusBarServiceItemView updateForContentType:serviceString:serviceCrossfadeString:maxWidth:actions:] + 390 frame #21: 0x2d5e74ee UIKit`-[UIStatusBarServiceItemView updateForNewData:actions:] + 186 frame #22: 0x2d6428d0 UIKit`-[UIStatusBarItemView initWithItem:data:actions:style:] + 324 frame #23: 0x2d642568 UIKit`-[UIStatusBarLayoutManager _createViewForItem:withData:actions:] + 108 frame #24: 0x2d5e6f74 UIKit`-[UIStatusBarLayoutManager _prepareEnabledItemType:withEnabledItems:withData:actions:itemAppearing:itemDisappearing:] + 264 frame #25: 0x2d5e6e22 UIKit`-[UIStatusBarLayoutManager prepareEnabledItems:withData:actions:] + 74 frame #26: 0x2d5e6c72 UIKit`-[UIStatusBarForegroundView _setStatusBarData:actions:animated:] + 162 frame #27: 0x2d5e6b96 UIKit`-[UIStatusBarForegroundView setStatusBarData:actions:animated:] + 710 frame #28: 0x2d671ebe UIKit`__44-[UIStatusBar _prepareToSetStyle:animation:]_block_invoke + 358 frame #29: 0x2d5fc230 UIKit`+[UIView(Animation) performWithoutAnimation:] + 72 frame #30: 0x2d66fcf4 UIKit`-[UIStatusBar _prepareToSetStyle:animation:] + 688 frame #31: 0x2d6579ca UIKit`-[UIStatusBar _requestStyleAttributes:animationParameters:] + 290 frame #32: 0x2d65696e UIKit`-[UIStatusBar requestStyle:animated:] + 86 frame #33: 0x2d65559a UIKit`-[UIApplication _createStatusBarWithRequestedStyle:orientation:hidden:] + 406 frame #34: 0x2d85122a UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] + 970 frame #35: 0x2d85bc68 UIKit`__84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 36 frame #36: 0x2d84fc5a UIKit`-[UIApplication workspaceDidEndTransaction:] + 130 frame #37: 0x3086c0e0 FrontBoardServices`__31-[FBSSerialQueue performAsync:]_block_invoke + 12 frame #38: 0x2a13782c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 frame #39: 0x2a136af0 CoreFoundation`__CFRunLoopDoBlocks + 216 frame #40: 0x2a13564a CoreFoundation`__CFRunLoopRun + 1714 frame #41: 0x2a082db0 CoreFoundation`CFRunLoopRunSpecific + 476 frame #42: 0x2a082bc2 CoreFoundation`CFRunLoopRunInMode + 106 frame #43: 0x2d653c36 UIKit`-[UIApplication _run] + 558 frame #44: 0x2d64ea30 UIKit`UIApplicationMain + 1440 * frame #45: 0x003b4ec2 Stox`main(argc=1, argv=0x01200b08) + 178 at main.m:17

Tercero:

thread #1: tid = 0x1d96b, 0x36fbf540 libc++abi.dylib`__cxa_throw, queue = ''com.apple.main-thread'', stop reason = breakpoint 3.2 frame #0: 0x36fbf540 libc++abi.dylib`__cxa_throw frame #1: 0x30798c22 libTrueTypeScaler.dylib`ScalerNewBlock(memoryContext*, long, long, void*, unsigned char, unsigned char) + 430 frame #2: 0x3077e172 libTrueTypeScaler.dylib`OutlineToPath(memoryContext*, fnt_ElementType const*) + 178 frame #3: 0x3079502a libTrueTypeScaler.dylib`ObtainDesiredOutline(memoryContext*, fnt_ElementType const*, unsigned long, void**) + 10 frame #4: 0x3077e07c libTrueTypeScaler.dylib`RenderPath(fsg_SplineKey*, memoryContext*, scalerGlyph const*) + 36 frame #5: 0x3077c980 libTrueTypeScaler.dylib`TTRenderGlyphs + 436 frame #6: 0x306c5722 libFontParser.dylib`TConcreteFontScaler::CopyGlyphPath(unsigned short, CGAffineTransform const*) const + 378 frame #7: 0x306a0ce6 libFontParser.dylib`FPFontCopyGlyphPath + 494 frame #8: 0x2a3abb4a CoreGraphics`CGFontCreateGlyphPath + 30 frame #9: 0x2a3aba56 CoreGraphics`CGFontCreateGlyphBitmap + 266 frame #10: 0x2a3b3c1a CoreGraphics`CGGlyphBuilder::create_missing_bitmaps(CGGlyphIdentifier const*, unsigned long, CGGlyphBitmap const**) + 82 frame #11: 0x2a6fd4dc libRIP.A.dylib`render_glyphs + 172 frame #12: 0x2a6fcaca libRIP.A.dylib`draw_glyph_bitmaps + 906 frame #13: 0x2a6fc430 libRIP.A.dylib`ripc_DrawGlyphs + 1108 frame #14: 0x2a3a1002 CoreGraphics`draw_glyphs + 274 frame #15: 0x2aaae268 CoreText`DrawSbixGlyphsAtPositions(TFont const*, CGFont*, TCFRef<__CFData const*> const&, unsigned short const*, CGPoint const*, unsigned long, CGContext*, CGAffineTransform, CGAffineTransform) + 1880 frame #16: 0x2aa6bcce CoreText`CTFontDrawGlyphsWithAdvances + 470 frame #17: 0x349eba1a UIFoundation`__NSStringDrawingEngine + 6710 frame #18: 0x349efa64 UIFoundation`-[NSAttributedString(NSExtendedStringDrawing) drawWithRect:options:context:] + 532 frame #19: 0x2d603370 UIKit`-[UILabel _drawTextInRect:baselineCalculationOnly:] + 4440 frame #20: 0x2d668ed4 UIKit`-[UILabel drawTextInRect:] + 488 frame #21: 0x2d668ce8 UIKit`-[UILabel drawRect:] + 84 frame #22: 0x2d668c70 UIKit`-[UIView(CALayerDelegate) drawLayer:inContext:] + 400 frame #23: 0x2d045910 QuartzCore`-[CALayer drawInContext:] + 228 frame #24: 0x2d02f350 QuartzCore`CABackingStoreUpdate_ + 2068 frame #25: 0x2d110b6c QuartzCore`___ZN2CA5Layer8display_Ev_block_invoke + 52 frame #26: 0x2d02eb34 QuartzCore`x_blame_allocations + 88 frame #27: 0x2d02e7e4 QuartzCore`CA::Layer::display_() + 1156 frame #28: 0x2d012d9c QuartzCore`CA::Layer::display_if_needed(CA::Transaction*) + 200 frame #29: 0x2d012a60 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24 frame #30: 0x2d012446 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 222 frame #31: 0x2d012250 QuartzCore`CA::Transaction::commit() + 324 frame #32: 0x2d5e51c8 UIKit`_afterCACommitHandler + 132 frame #33: 0x2a137844 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20 frame #34: 0x2a134f28 CoreFoundation`__CFRunLoopDoObservers + 276 frame #35: 0x2a13532a CoreFoundation`__CFRunLoopRun + 914 frame #36: 0x2a082db0 CoreFoundation`CFRunLoopRunSpecific + 476 frame #37: 0x2a082bc2 CoreFoundation`CFRunLoopRunInMode + 106 frame #38: 0x313e7050 GraphicsServices`GSEventRunModal + 136 frame #39: 0x2d64ea30 UIKit`UIApplicationMain + 1440 * frame #40: 0x003b4ec2 Stox`main(argc=1, argv=0x01200b08) + 178 at main.m:17


Como muestra la traza inversa, la aplicación no se detuvo sin motivo. Se detuvo porque se produjo una excepción y parece una excepción de C ++.

A diferencia de Objective-C, donde las excepciones solo deben generarse como resultado de errores de programación y, por lo tanto, son muy raras, existe una gran cantidad de código C ++ que arroja y atrapa muchas excepciones. En esa situación, probablemente sea mejor establecer solo un punto de interrupción en las excepciones de Objective-C, no en todas las excepciones.


En mi caso, la referencia estaba dentro de xcuserdata :

user$ grep -R "HelveticaNeue" ./ Binary file .//MyProject.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstate matches


Estaba experimentando el mismo problema exacto y rastreé el problema.

Asegúrese de que todas las fuentes que especifique en su Info.plist en Fonts provided by this application estén realmente en su paquete de aplicaciones.


Hay una forma más precisa de rastrear la fuente sospechosa en su aplicación usando el depurador y el hecho de que se detiene convenientemente en la llamada.

Paso 1: reproduzca el punto de interrupción __cxa_throw

Por lo general, esto sucede cuando se crea una instancia de uno (o posiblemente el primer) objeto UIView en su aplicación. Verás que tu depurador se ha roto y tendrás una pila como esta:

Paso 2: Seleccione la entrada en la traza de la pila con el símbolo FPFontCreateFontsWithPath

En mi caso, esta entrada era la línea 7 en la pila.

Si observa el desmontaje, notará la firma de la función de esta entrada:

¡Ah, guay! Parece que toma algunas cuerdas C. ¡Apuesto a que uno de esos es un filepath también!

Paso 3: ubica esa cadena en la memoria de la aplicación

Estoy ejecutando esto en un simulador (x86_64), que en mi computadora almacena los argumentos de la función en algunos de los registros que comienzan con r . Más detalles sobre los registros aquí .

Oprima Shift + Command + M o seleccione la opción "Debug> Debug Workflow> View Memory" del menú.

En la parte inferior de esta vista, revise los registros uno por uno e ingrese las direcciones. En mi caso, r14 contenía la ruta del archivo.

Muy bien, ahora sé la fuente que está en mal estado. Está buscando HelveticaNeue.ttc. Encontremos la referencia a eso en el proyecto.

Abra una terminal, navegue hasta su proyecto y ejecute:

$ ~/W/X/project> grep -R "HelveticaNeue" ./ .//MyProject/Main.Storyboard: <array key="HelveticaNeue.ttc"> .//MyProject/Main.Storyboard: <string>HelveticaNeue</string> .//MyProject/Main.Storyboard: <fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="18"/>

Impresionante, ahora cambie esos al sistema reemplazando name="HelveticaNeue" family="Helvetica Neue" con type="system" , abra el guión gráfico y edítelos manualmente o agregue una referencia a la fuente que falta en su aplicación (info.plist y objetivo).

Paso 4: Celebra 🎉 🎊 🍾 🍻


Se está lanzando una excepción, pero la persona que llama (por ejemplo, en libFontParser y libTrueTypeScaler) lo está manejando y no está llegando a su programa.

A menos que vea otra evidencia de un problema (como un mensaje de registro) o que la excepción llegue a su programa, suponga que la implementación lo está manejando. Puede continuar más allá de estas instancias en el depurador sin preocupaciones.


Si no encontró un problema en el archivo .plist, tal vez el problema esté en su archivo .storyboard .. Ábralo como código fuente desde Xcode o en textView desde Finder - busque <customFonts key="customFonts"> Tenía allí algunos vieja matriz / fuente irrelevante dentro ... :) simplemente la borró y se detuvo


Resolví este problema combinando la respuesta de nmock con la respuesta de DaNLtR .

Así que al principio busqué <customFonts key="customFonts"> y había Montserrat-Light presente en él.
Pero no estaba presente en info.plist ni se agregó al proyecto.

El problema desapareció una vez que Montserrat-Light.ttf en el proyecto y agregué una entrada para esta fuente en Fonts provided by this application en info.plist .

El siguiente es el resumen de la solución mencionada anteriormente:

  1. Busque sus archivos Storyboard o Xib para cualquier fuente personalizada.
    Los encontrará en <customFonts key="customFonts">
  2. Si en realidad se menciona una fuente personalizada, siga los pasos 3 y 4
  3. Agregue la fuente a su proyecto Xcode.
  4. Agregue una entrada a info.plist en Fonts provided by this application .
    Esta entrada debe ser el nombre del archivo de fuente seguido de su extensión.
  5. En caso de que <customFonts key="customFonts"> no contenga ninguna fuente personalizada (por ejemplo: Helvetica-Neue, etc.), intente eliminar la entrada <customFonts key="customFonts"> en el archivo Stroyboard o Xib como se indica en la respuesta de DaNLtR

Sé que es muy tarde para responder, pero espero que esto ayude a alguien.