• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

Objective-C 2.0 - Declared Properties (Unklarheit)

Das ist sie beim ihm ja auch nicht. Deshalb bekommt er ja die Warnung vom Compiler und die Fehlermeldung zur Laufzeit.

Wie kann der erste Code richtig sein, wenn er den falschen Methodennamen geschrieben hat? ;-)
Ich rezitiere mich noch mal und du liest es zu Ende: ;-)
Der erste Code ist demnach auch richtig, du hast nur den falschen Methodennamen geschrieben.
Neben dem falschen Methodennamen hat er die Nachricht auch noch ans Klassenobjekt geschickt und nicht an eine Instanz der Klasse. Objektive-C unterscheidet Klassenmethoden (+methode) und Instanzmethoden (-methode)!

MacApple

Da hab ich diesmal nicht aufgepasst. ;) Aber es ging mir primär um die Dot-Notation, wo er den Fehler eher umgangen als ausgemerzt hat.
 
Ich rezitiere mich noch mal und du liest es zu Ende: ;-)
Der erste Code ist demnach auch richtig, du hast nur den falschen Methodennamen geschrieben.
Ich habe bis zum Ende gelesen. Dein Satz ist aber ein Widerspruch in sich. Code ist richtig, wenn er das tut, was der Programmierer erwartet. Tut der Code das nicht, ist er falsch. Ob das nun an einem Tippfehler liegt oder am Vollmond ist egal. ;) Ein bisschen schwanger geht auch nicht.

MacApple
 
Ich habe bis zum Ende gelesen. Dein Satz ist aber ein Widerspruch in sich. Code ist richtig, wenn er das tut, was der Programmierer erwartet. Tut der Code das nicht, ist er falsch. Ob das nun an einem Tippfehler liegt oder am Vollmond ist egal. ;) Ein bisschen schwanger geht auch nicht.

MacApple

Tut mir leid ich neige manchmal etwas zur Fuzzy-Logic. Da kann frau wenigstens auch ein bisschen schwanger sein. :P
Im Prinzip hast du Recht
 
Ok, aber trotzdem verstehe ich nicht warum bei dir die setter-Methode anscheindend:
Code:
-(void)strInput:(NSString*)x
ist.
Selbst deine verlinkte Refernenz erklärt:

Code:
@property float value;
is equivalent to:

- (float)value;
- (void)setValue: (float)newValue;
Ergo muss sie bei deinem Code:
Code:
-(void)setStrInput:(NSString*)x
heißen.

Der erste Code ist demnach auch richtig, du hast nur den falschen Methodennamen geschrieben.
Vergleiche dazu auch Hillegass 3.Ausg S.144-145. Leider hab ich vom Amin nur das alte Buch, da gabs die Dot-Notation und propertys noch gar net.

Btw.: Hillegass kritisiert Apple für diese Dot Notation, da Methodenaufrufe schon fest definiert sind.

Doch es sind Setter und Getter in einem. Der Compiler setzt intern "@property float value;" um, zu dem genannten Äquivalent in der Referenz. Als wären es zwei Methoden, die so lauten:
"- (float)value;" und
"- (void)setValue: (float)newValue; ".
Um jetzt z.b. die Setter Methode nicht nutzen zu wollen um eine Eigenschaft Schreibgeschützt zu machen, gibts du dem Compiler einfach das Attribute "readonly" mit. Also: "@property (readonly, retain) float value".
Damit enfällt die setValue Methode.
Richtig ist das ich Anfangs nicht mit der Instanz der Klasse gearbetet habe. Um dort mit den Zugriffsmethoden zu arbeiten.

Was die Punkt Notation angeht, darüber lässt sich streiten ob es wirklich sinnvoll ist in Obj-C diese einzuführen. Ich kenne Obj-C bis jetzt nur ohne Punkt Notation. Durch die Beschreibung zu properties bin ich das erste mal darauf gestoßen. Fällt zwar für mich leichter, da ich mit Sprachen arbeite die nur Punkt Notation nutzen. Aber einen Mischmasch halte ich für Sinnlos. Entweder ohne Punkt Notation und wenn, dann ein kompletter umbau. Halte ich für nicht machbar und wird auch nicht kommen.

Ohne Punkt Notation, klappt der Aufruf nicht. D.h. hier ist sie leider fällig. Gefällt mir persönlich jetzt nicht so gut, dass ich nur wegen den properties, die Notation anwenden muss und sonst nicht. Aber naja, die Faulheit weniger zu tippen siegt hier. :D

mfg
paule
 
Ich weiß was @property macht.

Deine Deklationen sind auch vollkommen richtig, nur ohne Dot-Notation klappt das auch:

Code:
@implementation viewcontroller

-(void)convertBinToDec:(id)sender
{
 controller * con= [[controller alloc] init];
    [[S]controller[/S][COLOR="Red"]con[/COLOR] [COLOR="red"]set[/COLOR]StrInput:@"test"];
    [txtInput setStringValue:[con strInput]];
}

@end

Oder aber auch per key value coding:
Code:
@implementation viewcontroller

-(void)convertBinToDec:(id)sender
{   
    controller * con= [[controller alloc] init];
    [con setValue:@"test" forKey:@"strInput"];
    [txtInput setStringValue:[con valueForKey:@"strInput"]];
}

@end