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";
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top