Objetivo C - Custom @SynThesize?
-
27-10-2019 - |
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";
}
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.