Aide sur les static, const, dispatch_once

colas_colas_ Membre
septembre 2014 modifié dans API UIKit #1

Bonjour,


 


je souhaite créer une fonction qui m'arrondisse mes CGFloat pour que l'affichage soit plus propre.


 


J'ai commis ceci et comme je n'ai pas l'habitude, quelqu'un d'expérimenté pourrait-il me confirmer que c'est bon ?



#import <UIKit/UIKit.h>


CGFloat CGFloor_screenFriendly_cbd_(CGFloat aFloat) ;


#import "CBDUIFunctions.h"


static CGFloat scale_iVar ;

CGFloat scaleOfMainScreen_cbd_()
{
static dispatch_once_t onceToken;

dispatch_once(&onceToken,
^{
scale_iVar = [[UIScreen mainScreen] scale] ;
});

return scale_iVar ;
}



CGFloat CGFloor_screenFriendly_cbd_(CGFloat aFloat)
{
return roundf(aFloat*scaleOfMainScreen_cbd_())/scaleOfMainScreen_cbd_() ;
}

(si j'ai bien compris, sortir static dispatch_once_t onceToken; de la fonction ne change rien et marche aussi?)


 


Au début, j'avais fait ce qui suit mais j'ai voulu optimiser.



#import "CBDUIFunctions.h"


CGFloat CGFloor_screenFriendly_cbd_(CGFloat aFloat)
{
CGFloat = [[UIScreen mainScreen] scale] ;
return roundf(aFloat*scale)/scale ;
}

Réponses

  • AliGatorAliGator Membre, Modérateur

    Dans ton cas, le dispatch_once est un peu de l'overkill. C'est utile pour créer un singleton, ou faire un groupe de gros calculs qu'une seule fois... mais là  tu l'utilises juste pour encapsuler l'appel à  [[UIScreen mainScreen] scale], autrement dit juste l'appel à  la propriété "scale" du mainScreen, qui est certainement sous le capot déjà  une sharedInstance (en tout cas ça ne fait pas d'allocation d'un UIScreen à  chaque fois que tu appelles mainScreen, l'instance existe déjà ). Du coup tu n'y gagnes pas grand chose, ça complexifie ton code pour rien.


  • colas_colas_ Membre
    septembre 2014 modifié #3

    N'y a-t-il pas (comme tu le disais pour un autre post, message #3) l'envoi du message à  l'objet ?


     


    En gros, pourquoi dans ce message-là  tu me disais de fonctionniser la commande et là  non ?


    En tout cas, merci de ton aide.


     


    Maintenant que j'ai commis l'overkill, autant le garder non ? (quoique il faudrait pas que je prenne l'habitude d'overkiller)


  • Hello,


     


     




    N'y a-t-il pas (comme tu le disais pour un autre post, message #3) l'envoi du message à  l'objet ?




    ben y a pas de mal d'envoyer de messages à  des objets.


     


     




    En gros, pourquoi dans ce message-là  tu me disais de fonctionniser la commande et là  non ?




     


    Il te dit juste que le pattern dispatch_one ne c'est de "l'overkill", donc tu peux l'enlever.


     


    Ta fonction est la bonne pour moi :



    CGFloat CGFloor_screenFriendly_cbd_(CGFloat aFloat)
    {
    CGFloat = [[UIScreen mainScreen] scale] ;
    return roundf(aFloat*scale)/scale ;
    }
  • AliGatorAliGator Membre, Modérateur


    N'y a-t-il pas (comme tu le disais pour un autre post, message #3) l'envoi du message à  l'objet ?


     


    En gros, pourquoi dans ce message-là  tu me disais de fonctionniser la commande et là  non ?


    En tout cas, merci de ton aide.


     


    Maintenant que j'ai commis l'overkill, autant le garder non ? (quoique il faudrait pas que je prenne l'habitude d'overkiller)




     


    Parce que dans l'autre post c'est le pattern du Singleton (ou plutôt de la sharedInstance). Si on ne fait pas le dispatch_once, ça va allouer / instancier une nouvelle instance à  chaque fois.


     


    Alors que là  tu utilises [UIScreen mainScreen], qui n'instancie pas une nouvelle instance de UIScreen (mais te retourne un UIScreen déjà  existant, l'écran principal). Donc dans ton cas c'est que des accès à  des propriétés d'objets existants, alors que dans le cas du pattern Singleton/SharedInstance il risquerait de réinstancier un nouvel objet à  chaque appel.

  • En fait, on s'est mal compris. Dans l'autre poste, tu fronçais les sourcis car j'ai empaqueté des fonctions générales autour de core graphics dans un singleton. Tu me disais quel intérêt de faire un singleton et de se taper l'envoi de message au singleton juste pour une petite fonction (genre calculer le centre d'un CGRect).


    Bref. Merci de vos réponses ;-)
  • AliGatorAliGator Membre, Modérateur

    Oui parce que CoreGraphics est très orienté C et que instancier un singleton juste pour faire des méthodes utilitaires sur des structures c'était pas franchement nécessaire, d'autant que toutes les fonctions déjà  existantes comme CGRectGetMaxX() & co sont déjà  des fonctions donc autant rester dans le thème.


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