[Résolu] Newbie install appli

busterTheobusterTheo Membre
septembre 2015 modifié dans Apple Developer Programs #1

Bonjour,


j'ai enfin mon compte chez apple.


Je peux tester mon appli sur mon ipad.


J'ai testé des applis tests - Nickel.


 


Je teste mon vrai projet, et là  j'ai mon premier crash. Yeeeessss.


 


Je me retrouve (dans Xcode) sur une page avec plein de lignes incompréhensibles, avec ce message sur la première ligne.





 


libswiftCore.dylib`function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ():




Et cette ligne active



 


0xef6164 <+64>:  trap



 


Avec cela au-dessus



 


; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded> of Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ()).(closure #2)



 


 



J'ai essayé de jouer avec le debugger et tout un tas de truc.

 

Comment fait-on pour pister l'erreur à  partir de ces messages ?

 

Merci d'avance.


 


Mots clés:

Réponses

  • RomheinRomhein Membre
    septembre 2015 modifié #2

    Je dirais qu'il faut que tu ajoutes un exception breakpoint. Normalement ça devrait te mettre la ligne où il y a un problème.


     


    EDIT : un tuto pas mal


    http://jeffreysambells.com/2014/01/14/using-breakpoints-in-xcode


  • busterTheobusterTheo Membre
    septembre 2015 modifié #3

    Merci Romain pour ta réponse.


     


    J'ai mis un exception breakpoint, mais ça ne m'envoi pas sur la ligne d'erreur dans mon code.


     


    Je clique sur le petit bouton en bas du debugger (step into) avec ou sans "control" (step into instruction) et j'arrive dans n'importe quel fichier sans ligne active.


     


    J'ai bien regardé ton lien. Super. Mais je n'arrive pas à  traduire cela en swift.


    Tout ce que je trouve sur le web est en objC.


     


    Il me manque les trucs du NSException - J'y arrive pas



    @IBAction func exceptionBreakpointAction(sender: AnyObject) {
    do {
    // The Breakpoint Navigation has an Exception Breakpoint which will stop here.
    throw [NSException exceptionWithName:@Example reason:@Testing Breakpoints userInfo:nil]

    } catch (NSException *e) {
    // Nothing since this is an example.
    }
    }

    Pour les try catch etc, j'ai trouvé ça - Cool.


     


    Mais il me manque l'histoire des exception pour pouvoir afficher d'où vient le problème.


  • Et avec TOUT le message d'erreur ? Y'a pas un truc que t'aurais zappe dedans ?


  • busterTheobusterTheo Membre
    septembre 2015 modifié #5

    Ben non.


     


    Je met ici seulement un bout de la liste, mais il n'y a que des lignes de ce type



     


    libswiftCore.dylib`function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ():


        0xf1b124 <+0>:   push   {r4, r5, r6, r7, lr}


        0xf1b128 <+4>:   add    r7, sp, #0xc


        0xf1b12c <+8>:   push   {r8, r10, r11}


        0xf1b130 <+12>:  sub    sp, sp, #0x28


        0xf1b134 <+16>:  bic    sp, sp, #0x7


        0xf1b138 <+20>:  mov    r4, r3


        0xf1b13c <+24>:  ldr    r10, [r7, #0xc]


        0xf1b140 <+28>:  ldr    r3, [r7, #0x8]


        0xf1b144 <+32>:  tst    r2, #0x1


        0xf1b148 <+36>:  bne    0xf1b168                  ; <+68>


        0xf1b14c <+40>:  cmp    r1, #0x0


        0xf1b150 <+44>:  blt    0xf1b2ec                  ; <+456>


        0xf1b154 <+48>:  add    r1, r0, r1


        0xf1b158 <+52>:  mov    r2, r4


        0xf1b15c <+56>:  str    r10, [sp]


        0xf1b160 <+60>:  bl     0xf5061c                  ; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded> of Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ()).(closure #2)


    ->  0xf1b164 <+64>:  trap   


        0xf1b168 <+68>:  mov    r1, #0x0


        0xf1b16c <+72>:  cmp    r0, #0xd800


        0xf1b170 <+76>:  str    r1, [sp, #0x24]


        0xf1b174 <+80>:  str    r1, [sp, #0x20]


        0xf1b178 <+84>:  blo    0xf1b1a8                  ; <+132>


        0xf1b17c <+88>:  cmp    r0, #0xe000


        0xf1b180 <+92>:  bhs    0xf1b1a8                  ; <+132>



     


    J'ai d'autre part dans la console le fameux message



     


    fatal error: unexpectedly found nil while unwrapping an Optional value



    Et oui, on y est. Encore lui.


    Le problème c'est que je ne sais pas à  quelle ligne cela fait référence.


     


    En attendant je piste avec des println (appli lancée sur le simulateur et sur l'ipad)


     


    J'ai des trucs différents.


     


    J'ai noté qu'il s'agirait d'une image qui n'est pas enregistrée dans l'ipad.


    Curieux.


     


    Voici mes sorties console :


     


    Simulateur



     


    imagePickee = <UIImage: 0x7fc38adb8f70> size {560, 420} orientation 0 scale 1.000000


     


    newImageScaled = <UIImage: 0x7fc38aedaca0> size {1024, 768} orientation 0 scale 2.000000


     


    pathFull = /Users/busterTheo/Library/Developer/CoreSimulator/Devices/2D9BE8B8-D70D-411F-BDCD-54393ADB1A41/data/Containers/Data/Application/F266979A-F659-4D04-935D-3E03032C3F85/DocumentsFrontalthis girl in my head -2015-09-24-19-12-09.png


     


    self.imageViewEtapes.image = Optional(<UIImage: 0x7fc38d189750> size {2048, 1536} orientation 0 scale 1.000000)


     


    photoFrontal TV = Frontalthis girl in my head -2015-09-24-19-12-09.png



     


    Et sur l'iPad



     


    imagePickee = <UIImage: 0x16a51430> size {2592, 1936} orientation 1 scale 1.000000


     


    newImageScaled = <UIImage: 0x156759a0> size {1024, 768} orientation 0 scale 2.000000


     


    pathFull = /var/mobile/Containers/Data/Application/397B318B-3579-4BFE-B04E-857EF3D581E7/DocumentsFrontalbobo-2015-09-24-19-14-17.png


     


    self.imageViewEtapes.image = nil


     


    photoFrontal TV = Frontalbobo-2015-09-24-19-14-17.png


     


    fatal error: unexpectedly found nil while unwrapping an Optional value



     


    Voici le code d'écriture de l'image dans la machine :



    //Adresse répertoire photos
    let paths: NSArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDir: NSString = paths.objectAtIndex(0) as! NSString


    // On fabrique le nom de la photo
    frontalPatientFullURL = NSString(format: "Frontal\(nomTextField.text)-%@.png", theDate) as String

    // On fabrique le chemin total
    let pathFull: NSString = documentsDir.stringByAppendingString(frontalPatientFullURL!)

    // On fabrique l'image
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)

    Ce code fonctionne bien sur le simulateur et pas sur l'iPad. Oups...


     


    Merci d'avance pour l'astuce du siècle.


  • busterTheobusterTheo Membre
    septembre 2015 modifié #6

    Bon, dans un premier temps, j'ai résolu mon problème de répertoire d'enregistrement de l'image et de sa récupération. Elle n'est donc plus nil. Mais par contre, j'ai un énoooooorme problème (voir plus bas).


     


    Code qui fonctionne pour ceux que ça intéressent...


     


    Nouveau code d'écriture :



    let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String
    frontalPatientFullURL = NSString(format: "Frontal\(nomTextField.text)-%@.png", theDate) as String
    let pathFull: NSString = documentsDir + "/" + frontalPatientFullURL
    pngFullData.writeToFile(pathFull as String, atomically: true)

    Nouveau code de récupération :



    let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String

    if frontalPatientFullURL != "" {
    let pathFull: NSString = documentsDir + "/" + frontalPatientFullURL

    if let zeImage:UIImage = UIImage(contentsOfFile: pathFull as String) {
    self.imageViewEtapes.image = zeImage
    println("etape1L1 --> Image bien récuperée")
    } else {
    println("etape1L1 --> Image pas récuperée")
    }

    self.imageViewEtapes.image = scaledImageWithImage(self.imageViewEtapes.image!, size: CGSize(width: 560, height: 420))
    }

    Alors mon problème :


    Je commence à  maà®triser le debugger, et donc à  bien lire les variables (par thread et tout et tout).


    Et donc, j'ai un paquet de variable à  nil, et donc j'ai plein de crash dans mes enchainement d'écran.


     


    Ce que je ne comprend pas, c'est que sur certain écrans, un type de code fonctionne et pas sur d'autres.


    Par exemple :


    sur écran, cela est accepté :



    var viewPoigneeTopLeft: PoigneeRampeE1L2!

    alors que sur le suivant, je suis obligé de faire cela :



    var viewPoigneeTopLeft: PoigneeRampeE1L2 = PoigneeRampeE1L2()

    Bien que sur les deux écrans, je fasse plus loin, exactement le même code :



    viewPoigneeTopLeft = PoigneeRampeE1L2(frame: CGRectMake(poigneeTopLeftX, poigneeTopLeftY, 22, 22))

    et c'est pareil pour à  peu-près tous les objets :


    ça ça passe sur un écran :



    var label1Forcer: UILabel!

    alors que sur un autre je suis obligé de faire cela :



    var label1Forcer: UILabel = UILabel()

    et c'est pareil pour tous les uiviews et uibutton, etc.


     


     


    Evidemment, tout cela sur ipad, alors que sur le simulateur, aucun problème. Le même code fonctionne sur tous les écrans.


     


    Bon, si ce n'était que cela, il suffirait que je remonte mes manches, et allons-y, je remplace tout ce petit monde dans mes 70 fichiers, et c'est réglé. Genre 3 jours de taf inutile.


     


    Mais le pire, c'est que tout le code qui en découle doit être également modifié, et là , ça craint vraiment trop.


    Par ex :



    var popUpFieldForcer: PopUpField!

    qui passe sur les deux premiers écrans, doit être remplacé par :



    var popUpFieldForcer: PopUpField = PopUpField()

    sur les écrans suivants.


    Et donc ce code



    if popUpFieldForcer != nil {
    popUpFieldForcer.removeFromSuperview()
    label1Forcer.removeFromSuperview()
    label2Forcer.removeFromSuperview()
    label3Forcer.removeFromSuperview()
    }

    n'est plus valable sur les écrans suivant alors qu'il fonctionne sur les deux premiers


    Erreur de Xcode (on peut pas comparer le truc avec nil)


     


     


    Il doit être remplacé par cela



    popUpFieldForcer.removeFromSuperview()
    label1Forcer.removeFromSuperview()
    label2Forcer.removeFromSuperview()
    label3Forcer.removeFromSuperview()

    etc etc etc


     


     


     


    Si quelqu'un a une idée, parce que c'est carrément étrange.


     


    Merci d'avance - Là , je craque.


  • En fait, je remplace tous les :



    var uneView: UIView!

    par :



    var uneView: UIView?

    Optionnal....


     


    Et puis donc, partout où se trouve, par ex :



    uneView.backgroundColor = FondsColor

    je remplace par :



    uneView!.backgroundColor = FondsColor

    En résumé je remplace tous les "!" et "rien" par "?" et "!" - pfffff


     


    Est-ce que j'ai bon ?


     


    Merci


  • busterTheobusterTheo Membre
    septembre 2015 modifié #8

    Je continue à  me répondre à  moi-même, ça peut servir aussi aux autres newbies.


     


    En gros, je faisais une erreur d'interprétation de tous les nil visibles dans le debugger.


     


    J'avais des tonnes de nil, et c'était normal, car il s'agissait des trucs qui n'étaient pas encore utilisés. Je suis débile.


    Et lors d'un crash, évidemment, ils sont tous visibles dans le debugger.


     


    Bref, ayant résolu mes problèmes d'images nil à  cause de mauvais chemin de répertoire, à  l'aide de l'optionnel binding, je n'ai plus de crash.


     


    Je suis super content de voir mon appli sur l'ipad, qui fonctionne sans crasher. Mais ne crions pas trop tôt victoire.


    J'ai encore pas mal de trucs à  tester.


     


    J'ai par contre un message d'erreur dans la console, sans crash. Mais je créerai un nouveau post après avoir fait quelques essais pour le résoudre.


     



     


    [PLLogging] Couldn't create log directory: The operation couldn't be completed. (Cocoa error 513.)



    Peut-être mon nouveau chemin de répertoire n'est-il pas bon...


     


    Je met résolu.


     


    Merci pour l'aide des barmen. Les remarques que vous avez laissées sur tous mes autres posts, m'ont bien aidé. Surtout les histoire de nil, optionnel, et autre bindings...


    :D   :p   :p  


  • AliGatorAliGator Membre, Modérateur
    septembre 2015 modifié #9


    partout où se trouve, par ex :


    uneView.backgroundColor = FondsColor
    je remplace par :

    uneView!.backgroundColor = FondsColor
    En résumé je remplace tous les "!" et "rien" par "?" et "!" - pfffff


    Est-ce que j'ai bon ?
    Oh mon Dieu. Ouch.


    Tu viens de tuer une famille entière de poneys.

    http://alisoftware.github.io/swift/2015/09/06/thinking-in-swift-1/
  • Buster, faut changer tes habitudes de travail. La prochaine fois, arrange-toi pour tuer une famille de moutons. C'est meilleur au goût.



  • Buster, faut changer tes habitudes de travail. La prochaine fois, arrange-toi pour tuer une famille de moutons. C'est meilleur au goût.




     


    Non pas les pauvres moutons, je pense qu'il y a pénurie en ce moment avec  L'Aà¯d https://fr.wikipedia.org/wiki/Ibrahim#Le_sacrifice_demand.C3.A9_.C3.A0_Ibrahim

  • Merci AliGator d'insister sur les poneys. Tu m'avais déjà  suggéré ce lien que j'avais lu.


    Je l'ai relu en prenant d'avantage de temps. J'ai au moins enregistré une chose : Xcode is a newbie. Donc, ne pas m'y fier et réfléchir d'avantage.


     


    En regard de mes deux dernières remarques (plus haut), je n'ai pas eu finalement à  faire ce truc



    uneView!.backgroundColor = FondsColor

    Donc, ouf, ce poney est sauvé.


     


    Mais par contre dans tous mes controllers, j'ai mes déclarations de variables ainsi.


    Je tue des poneys ?



    var imageOeil: UIImageView!

    Sans quoi, j'aime beaucoup ton blog. Notamment ce lien que je vais creuser.


    Et en chinant, je suis aussi tombé là -dessus. J'y ai trouvé des choses qui m'intéressaient.


     


    Toutes ces lectures m'enthousiasment, mais je me sens de plus en plus découragé...


  • J'habite à  la campagne, et je ne tue pas les araignées, je les met dans le jardin.  :o


    Aà¯d mabrouk




  • Non pas les pauvres moutons, je pense qu'il y a pénurie en ce moment avec  L'Aà¯d https://fr.wikipedia.org/wiki/Ibrahim#Le_sacrifice_demand.C3.A9_.C3.A0_Ibrahim




    Bon d'accord, Buster pense à  tuer une famille de chévres la prochaine fois.

  • AliGatorAliGator Membre, Modérateur

    Mais par contre dans tous mes controllers, j'ai mes déclarations de variables ainsi.
    Je tue des poneys ?


    var imageOeil: UIImageView!

    Si c'est un IBOutlet, ça fait partie des exceptions où c'est acceptable de sacrifier un poney de temps en temps, parce qu'il y a une justification derrière (c'est lié à  la façon dont les IBOutlets fonctionnent)

    Si ce n'est pas un IBOutlet, ça dépend de ton contexte, je ne pourrais pas juger le crime sans avoir enquêté dessus, chaque meurtre de poney est différent (à  toi de plaider ton innocence et de m'expliquer pourquoi tu étais en légitime défense quand tu as tué ce poney et donc justifier pour quelle raison on devrait te pardonner pour ce crime, si c'est justifié tu auras peut-être la clémence du jury)
  • Ben c'est simple, sur mon écran (dans tous d'ailleurs), j'ai des boutons, des champs textes, des labels, des objets custom, etc.


    Tout ce petit monde est en code (je sais, j'ai tort, mais c'est comme ça, je ne peux plus revenir en arrière, c'est dans des pageViews...


    Ils sont donc déclarés au début de mon fichier, puis ensuite utilisés plus loin dans des fonctions qui traitent tout ça.


    Par ex :



    imageOeil = UIImageView(frame: CGRectMake(viewFille2Etapes.bounds.size.width/2 - 15, 20, 31, 19))
    imageOeil.image = UIImage(named: "oeil.png")
    viewFille2Etapes.addSubview(imageOeil)

    ou bien



    let resultatColor = UIColor(red: 124/255, green: 131/255, blue: 137/255, alpha: 1.0)
    labelResultat = UILabel(frame: CGRectMake(0, 55, viewFille2Etapes.bounds.size.width, 40))
    labelResultat.backgroundColor = UIColor.clearColor()
    labelResultat.text = "RESULTAT"
    labelResultat.font = UIFont(name: "Lato-Lig", size: 16.0)
    labelResultat.textColor = resultatColor
    labelResultat.textAlignment = .Center
    viewFille2Etapes.addSubview(labelResultat)

    ou bien encore



    let champsColor = UIColor(red: 252/255, green: 252/255, blue: 252/255, alpha: 1.0)
    let borderChampsColor = UIColor(red: 217/255, green: 217/255, blue: 217/255, alpha: 1.0).CGColor
    boutonRegard = UIButton(frame: CGRectMake(boutonRegardX, boutonRegardY, 155, 34))
    boutonRegard.setTitle("Regard :", forState: .Normal)
    boutonRegard.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left
    boutonRegard.contentEdgeInsets = UIEdgeInsetsMake(0.0, 6.0, 0.0, 0.0)
    boutonRegard.addTarget(self, action: "tapRegardButton", forControlEvents: UIControlEvents.TouchUpInside)
    boutonRegard.backgroundColor = champsColor
    boutonRegard.titleLabel!.font = UIFont(name: "Arial", size: 15.0)
    boutonRegard.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)
    boutonRegard.layer.cornerRadius = 5.0
    boutonRegard.layer.borderWidth = 1
    boutonRegard.layer.borderColor = borderChampsColor
    viewFille2Etapes.addSubview(boutonRegard)

    Je sais que le let result... devrait avoir une majuscule - je sais qu'il y a des magic numbers, je sais que c'est mal nommé - etc


    Mais à  part ça, tout va bien, non ?


     


    Ou bien devrais-je mettre des ? sur toutes mes déclarations de variables (de bouton, labels, etc) ?


     


    Voilà , j'attend le verdict. J'ai préparé mes oranges. Chui prêt. :-*


  •  


     


    Ou bien devrais-je mettre des ? sur toutes mes déclarations de variables (de bouton, labels, etc) ?

     


    On déclare une variable optionnelle que si on estime que celle-ci peut être sans valeur durant son temps de vie. C'est un peu comme l'histoire des variables et des constantes. Donc non, mettre toutes les variables comme optionnelles est une mauvaise idée, il faut prendre au cas par cas et répondre à  la question "Est-ce que cette variable peut être sans valeur durant son temps de vie ?". 


Connectez-vous ou Inscrivez-vous pour répondre.