Objektiv c - benutzerdefinierte @synthesize?
-
27-10-2019 - |
Frage
Ist es möglich, irgendwie eine benutzerdefinierte @synthesize zu erstellen, um Custome Getter, Setter, zu generieren?
Zum Beispiel:
@interface
@property (nonatomic, retain) MyObject *object;
@end
@implementation
@lazyInitialize object;
@end
Und definieren Sie dann @lazyinitialize irgendwie, um eine faule Initialisierungsmethode zu generieren
//@lazyInitialize
- (id)"property name"
{
if (!"property name")
{
"property name" = [[["property name" class] alloc] init];
}
return "property name";
}
Lösung
Sie könnten jedoch etwas anderes ausprobieren. Ich hätte vor ein paar Tagen nicht mehr daran gedacht, aber ich habe zufällig gelesen Kakao mit Liebe. In dem verknüpften Beitrag diskutierte er, wie er a machte #define
Makro, das die gesamte Klasse für einen Singleton "generieren" würde, wo immer Sie das Makro angerufen haben. Du kannst Laden Sie seinen Code herunter Dazu (kann Ideen zu Ihrer eigenen Implementierung geben).
Vielleicht so etwas wie (WARNUNG: Ungetesteter Code voraus):
#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; \
}
würde funktionieren? Ich entschuldige mich, dass ich keine Zeit habe, es richtig für Sie zu testen. Nehmen Sie das also als faire Warnung, dass dies keine schnelle Kopier-/Einfügen -Lösung ist. Das tut mir leid. Hoffentlich ist es immer noch nützlich! ;))
Beispiel Verwendung
Dies sollte wieder funktionieren WARNUNG: Ungetesteter Code voraus:
Header
// ....
@interface SomeClass : NSObject {
NSObject *someObj;
}
@end
Implementierung
@implementation SomeClass
// ....
SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(someObj, NSObject);
// ....
@end
Andere Tipps
@synthesize
In Objective-C funktioniert in C#in ähnlicher Weise die automatische Eigenschaftssyntax, da beide die minimal benötigte Syntax zum Erstellen von Eigenschaftsgeräten/-setzern generieren. Wenn Sie in beiden Sprachen benutzerdefinierte Funktionen wünschen, müssen Sie sie manuell implementieren.
ich mag wirklich Ryan Wersals Antwort von a #define
Um Ihr eigenes Makro zu rollen. Sie müssten die Methode noch selbst schreiben, aber Sie tun es nur einmal.