Pregunta

¿Es posible crear de alguna manera un personalizado @synthesize para generar getter custome, setters?

Por ejemplo:

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

@implementation
@lazyInitialize object;
@end

Y luego de alguna manera defina @lazyInitialize para generar un método de inicializador perezoso

//@lazyInitialize

- (id)"property name"
{
   if (!"property name")
   {
      "property name" = [[["property name" class] alloc] init];
   }
   return "property name";
}
¿Fue útil?

Solución

Sin embargo, podrías probar algo diferente. No hubiera pensado en esto hace más de un par de días, pero estaba leyendo Cacao con amor. En la publicación vinculada, discutió cómo hizo un #define Macro que "generaría" toda la clase para un singleton en donde sea que llame a la macro desde. Puedes Descarga su código Para esto (puede dar ideas sobre su propia implementación).

Quizás algo como (Advertencia: Código no probado por delante):

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

¿trabajaría? Pido disculpas por no tener tiempo para probarlo correctamente por usted, así que tome eso como una advertencia justa de que esta no es una solución rápida de copiar/pegar. Lo lamento. ¡Ojalá sea útil! ;)


Uso de ejemplo

Esto debería funcionar, de nuevo Advertencia: Código no probado por delante:

Encabezamiento

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

Implementación

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

Otros consejos

@synthesize En Objective-C funciona de manera similar a la sintaxis de propiedades automáticas en C#, ya que ambos generan la sintaxis mínima requerida para crear getters/setters de propiedades. En ambos idiomas, si desea una funcionalidad personalizada, debe implementarlas manualmente.

de verdad me gusta Respuesta de Ryan Wersal de usar un #define para rodar tu propia macro. Todavía tendrías que escribir el método tú mismo, pero solo lo haces una vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top