Objectif C - @synthesize personnalisé?
-
27-10-2019 - |
Question
Est-il possible de créer en quelque sorte un @synthesize personnalisé pour générer custume getter, setters ??
Par exemple:
@interface
@property (nonatomic, retain) MyObject *object;
@end
@implementation
@lazyInitialize object;
@end
Et puis définir en quelque sorte @lazyInitialize pour générer une méthode d'initialisation paresseuse
//@lazyInitialize
- (id)"property name"
{
if (!"property name")
{
"property name" = [[["property name" class] alloc] init];
}
return "property name";
}
La solution
Vous pouvez essayer quelque chose de différent, cependant. Je ne l'aurais pas pensé à cela il y a plus de deux jours, mais je me trouvais à la lecture Cocoa With Love . Dans le poste lié, il a discuté de la façon dont il a fait une macro #define
qui « générer » toute la classe pour un singleton dans où vous avez appelé la macro. Vous pouvez télécharger son code pour cela (peut donner des idées sur votre propre implémentation).
Peut-être quelque chose comme ( Attention: code non testé en avant ):
#define SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(objectName, objectType) \
\
- (objectType *)objectName \
{ \
if(!objectName) \
{ \
objectName = [[objectType alloc] init]; \
} \
return objectName; \
} \
\
- (void)set##objectName:(objectType *)value \
{ \
[value retain]; \
[objectName release]; \
objectName = value; \
}
fonctionnerait? Je suis désolé que je n'ai pas le temps de tester correctement pour vous, alors prenez que comme un avertissement juste que ce n'est pas une copie rapide / solution coller. Désolé pour ça. Si tout va bien, il est toujours utile! ;)
Exemple d'utilisation
Cela devrait fonctionner, encore une fois Attention: code non testé en avant :
En-tête
// ....
@interface SomeClass : NSObject {
NSObject *someObj;
}
@end
Mise en œuvre
@implementation SomeClass
// ....
SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(someObj, NSObject);
// ....
@end
Autres conseils
@synthesize
en Objective-C fonctionne de façon similaire à la syntaxe de la propriété automatique en C #, en tant que génèrent la syntaxe minimale requise pour la création getters / setters propriété. Dans les deux langues, si vous voulez des fonctionnalités personnalisées, vous devez les mettre en œuvre manuellement.
Je aime vraiment la réponse de Ryan Wersal d'utiliser un #define
pour rouler votre propre macro. Vous auriez encore écrire la méthode vous, mais vous ne le faites qu'une seule fois.