2016-07-22 3 views
0

Ich glaube, das Bild ist ziemlich beschreibend für mein Problem. Wenn ich nur eine benutzerdefinierte definieren getter wie folgt:Angabe nur Getter erzeugt Warnung b/c kein Setter, aber Setter wird nicht kompilieren

- (UIImage *) secondaryIconImage { 
    if (_secondaryIconImage) return _secondaryIconImage; 
    return nil; 
} 

dann bekomme ich eine Fehlermeldung: ‚cannot pair a synthesized setter with a user defined getter‘. Allerdings, wenn ich versuche, die setter auch nicht mein Code zu erklären, überhaupt kompiliert:

- (void) setSecondaryIconImage:(UIImage *)secondaryIconImageVar { 
    _secondaryIconImage = secondaryIconImageVar; 
} 

Insbesondere das gibt mir die Kompilierung Fehler ‚Use of undeclared identifier _secondaryIconImage

ich vielleicht dachte, wenn ich die erklärte Setter Ich würde die Instanzvariable selbst synthetisieren müssen, also habe ich versucht, hinzuzufügen:

Dies hat nicht geholfen. Was ist hier los und wie kann ich es beheben?

p.s. Ich habe einen eigenen Getter, weil ich irgendwann etwas Zarteres machen muss, aber ich sah keinen Grund, das Beispiel zu komplizieren, da mir selbst dieses grundlegende Beispiel ein Problem bereitet.

+0

Warum brauchen Sie diesen Setter? Das ist genau das, was der eingebaute in einem tun würde ... Ihr Kompilierungsfehler ist aufgrund der Tatsache, dass Sie keine '_secondaryIconImage' Variable in Ihrer Klasse definiert haben. Wenn Sie das definieren, dann sollte alles für Sie gut zusammenstellen. – Putz1103

+0

@ Putz1103 Ich möchte mehr tun, sah nur keinen Grund, das in den Code aufzunehmen. – helloB

Antwort

2

Wie Sie bemerken, können Sie den Getter nicht ohne den Setter definieren. (Ihr Getter macht natürlich keinen Sinn, also nehme ich an, Ihr tatsächlicher Getter ist komplexer?)

Wenn Sie den Getter und den Setter definieren, wird nichts für Sie synthetisiert (da Sie alles geschrieben haben, gibt es nichts zu tun synthetisieren), und kein Ivar wird für Sie definiert. Sie müssen es selbst definieren, wenn Sie es brauchen.

Sie müssen explizit anfordern eine Ivar über Ihre @synthesize (dank Richard Ross mich gerade für die Einstellung):

@synthesize secondaryIconImage = _secondaryIconImage; 

Ihr Code für eine Eigenschaft fragt_secondaryIconImage genannt, so die Ivar __secondaryIconImage wäre.

+1

Die zweite Form ('@synthesize secondaryIconImage = _secondaryIconImage') ist die richtige Form. Die erste Form ist ein No-Op, da '@ synthetisieren' ohne einen assoziierten Namen keine iVar aus Legacy-Kompatibilitätsgründen erzeugt. –