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";
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top