Aide sur les static, const, dispatch_once
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 ;
}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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,
ben y a pas de mal d'envoyer de messages à des objets.
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 :
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.
Bref. Merci de vos réponses ;-)
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.