Domanda

È possibile creare in qualche modo un @syntesize personalizzato per generare Custome Getter, setter ??

Per esempio:

@interface
@property (nonatomic, retain) MyObject *object;
@end

@implementation
@lazyInitialize object;
@end

E poi in qualche modo definisci @lazyinitialize per generare un metodo di inizializzatore pigro

//@lazyInitialize

- (id)"property name"
{
   if (!"property name")
   {
      "property name" = [[["property name" class] alloc] init];
   }
   return "property name";
}
È stato utile?

Soluzione

Potresti provare qualcosa di diverso, però. Non ci avrei pensato più di un paio di giorni fa, ma mi è capitato di leggere Cocoa con amore. Nel post collegato, ha discusso di come ha fatto un #define Macro che "genererebbe" l'intera classe per un singleton da dove hai chiamato la macro. Puoi Scarica il suo codice Per questo (può dare idee sulla propria implementazione).

Forse qualcosa di simile (ATTENZIONE: codice non testato davanti):

#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; \
}

funzionerebbe? Mi scuso che non ho tempo per testarlo correttamente per te, quindi prendilo come equo avvertimento che questa non è una soluzione di copia/incolla rapida. Mi dispiace per questo. Spero che sia ancora utile! ;)


Esempio di utilizzo

Questo dovrebbe funzionare, di nuovo ATTENZIONE: codice non testato davanti:

Intestazione

// ....
@interface SomeClass : NSObject {
    NSObject *someObj;
}
@end

Implementazione

@implementation SomeClass
// ....
SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(someObj, NSObject);
// ....
@end

Altri suggerimenti

@synthesize In Objective-C funziona in modo simile alla sintassi della proprietà automatica in C#, in quanto entrambi generano la sintassi minima richiesta per la creazione di proprietà/set di proprietà. In entrambe le lingue, se si desidera funzionalità personalizzate, devi implementarle manualmente.

mi piace molto La risposta di Ryan Wersal di usare un #define per lanciare la tua macro. Dovresti ancora scrivere il metodo da solo, ma lo fai solo una volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top