• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

erste eigene Klasse

DavidG

Wohlschmecker aus Vierlanden
Registriert
09.02.10
Beiträge
236
Hallo...

und zwar fange ich mit dem Entwickeln von iOS-Apps an...habe mir zum Lernen von video2brain das Video-Tutorial gekauft und bin nun bei eigenen Klassen angelangt...

Hab mir das Video dazu angeschaut und direkt danach versucht es iwie nachzubauen...als dann gravierende Fehler angezeigt wurden bin ich das Video nochmal durchgegangen und hab die fehlenden Elemente eingebaut, die ich noch vergessen hab als Anfänger :D

Jetzt hab ich so ziemlich alles wie im Video...aber es funzt ned...

Wenn ich in der AppDelegate.m eine Property aus meiner angelegten Klasse definieren will, dann kommt "Property "breite" not found on object of type "Rechteck", obwohl ich die "breite" zu 100% eingetragen hab und auch mit @synthesize gedingst :D


Kann ja mal bissel Code hier hin kopieren...:

Code:
@interface Rechteck : NSObject

@property (assign) int laenge;
@property (assign) int breite;

- (int) flaeche;

@end

Code:
@implementation Rechteck

@synthesize laenge;
@synthesize breite;

- (int) flaeche
{
    
    return laenge * breite;
    
}

@end

Code:
#import "AppDelegate.h"
#import "Rechteck.h"


@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    
    Rechteck *flaeche1 = [[Rechteck alloc] init];
    
    flaeche1.breite = 14;

    
    return YES;

[...]

}


Hoffe jemand kann mir da iwie helfen und den Fehler finden :/


lg David
 
Der Code ist eigentlich korrekt und sollte funktionieren. Bis auf die Tatsache, dass du in der application:didFinishLaunching..-Methode nicht das (sonst übliche) window erzeugst. Sind die Auslassungszeichen an der falschen Stelle?
Das sollte dann aber eher zu einem Absturz führen. Den property-Fehler kann ich mir nicht erklären.
Cache leeren und dreimal um den Schreibtischstuhl rennen?
 
Deine Klasse funktioniert bei meinem Test reibungslos! :)
Hast du das Projekt mal "gecleant" ?


Wurde in dem video2brain - Tutorial in dieser Art und Weise @synthesize genutzt?
Ich habe mir mittlerweile angewöhnt dies überhaupt nicht mehr zu verwenden, da du auch ohne @synthesize mit
"_laenge" und "_breite" auf @properties des Interfaces zugreifen kannst.

Rechteck.m

Code:
[COLOR=#B4261A][COLOR=#0433ff]#import [/COLOR]"Rechteck.h"[/COLOR]


[COLOR=#0433FF]@implementation[COLOR=#000000] Rechteck[/COLOR][/COLOR]


- ([COLOR=#0433ff]int[/COLOR]) flaeche
{
[COLOR=#3495AF][COLOR=#0433ff]return[/COLOR]_laenge[COLOR=#000000] * [/COLOR]_breite[COLOR=#000000];[/COLOR][/COLOR]
}


[COLOR=#0433FF]@end[/COLOR]

AppDelegate.m


Code:
- ([COLOR=#0433ff]BOOL[/COLOR])application:([COLOR=#3495af]UIApplication[/COLOR] *)application didFinishLaunchingWithOptions:([COLOR=#3495af]NSDictionary[/COLOR] *)launchOptions
{
    
[COLOR=#3495AF]Rechteck[COLOR=#000000] *flaeche1 = [[[/COLOR]Rechteckalloc[COLOR=#000000]] [/COLOR]init[COLOR=#000000]];[/COLOR][/COLOR]
    
    [flaeche1 [COLOR=#3495af]setBreite[/COLOR]:14];
    [flaeche1 [COLOR=#3495af]setLaenge[/COLOR]:10];
    
    [COLOR=#3495af]NSLog[/COLOR]([COLOR=#b4261a]@"Fläche des Rechtecks: %i"[/COLOR], [flaeche1 [COLOR=#3495af]flaeche[/COLOR]]);
    [...]
}

Die von mir verwendeten "Setter" sind Syntactic Sugar, von ObjectiveC, und können ohne Deklaration genutzt werden.
Aber natürlich kannst du auch mit ".breite" auf die Objekte zugreifen.

Zusammenfassend kann man mein Post eig. genüsslich in die Tonne treten, da ich außer dem "Clean" auch keine Idee habe wieso dein Code nicht funktioniert! :-p
 
Ich habe mir mittlerweile angewöhnt dies überhaupt nicht mehr zu verwenden, da du auch ohne @synthesize mit
"_laenge" und "_breite" auf @properties des Interfaces zugreifen kannst.
Bitte bring dem Jungen nicht so einen Blödsinn bei. Man greift immer über Setter/Getter auf Properties zu. Du hebelst durch den direkten Zugriff KVO aus.

Die von mir verwendeten "Setter" sind Syntactic Sugar, von ObjectiveC, und können ohne Deklaration genutzt werden.
Nein, die sind kein "Syntactic Sugar". Setter und Getter generiert der Compiler für Dich, abhängig davon, wie Du die Property deklariert hast. Bei älteren Compilerversionen ist dafür noch das @synthesize erforderlich.

Aber natürlich kannst du auch mit ".breite" auf die Objekte zugreifen.
Die "Dot-Notation" übersetzt der Compiler übrigens direkt in das, was Du als "Syntactic Sugar" bezeichnet hast. ;) Die Dot-Notation ist der Syntactic Sugar.

@DavidG
Implementiere mal die Methode flaeche so:
Code:
- (int) flaeche
{
    return self.laenge * self.breite;
}
MacApple
 
Bitte bring dem Jungen nicht so einen Blödsinn bei. Man greift immer über Setter/Getter auf Properties zu. Du hebelst durch den direkten Zugriff KVO aus.

Weil du "immer" geschrieben hast... Stupide getter und setter sind eine Krankheit, aber wenigstens bläht es in objective-c den Code nicht so auf.
 
Das per default dumme Getter und Setter keine gute Sache sein müssen und in manchen Sprachen zusätzlich auch noch den Code aufblähen.

a) werden die Properties nur "intern" verwendet, oder gehören sie zum api der Klasse?
b) ist die Namensgebung der standard Getter und Setter wirklich gut?

Als schlechtes Beispiel nehme ich hier die ORM, viele ORM haben bez. hatten verlangt das man die dummen getter und setter Methoden erstellt (man lässt sie ja meistens von der IDE gnerieren). Diese sind zu allem übel dann meistens auch noch public und haben eine Bezeichnung die nichts darüber aussagt wieso man zum Bsp. die setter aufruft. Oft gibt das dann die "blutleeren" Klassen.. viele getter und setter, aber die Klasse zeigt nicht was damit gemacht werden kann.

Das bedeutet nun nicht das getter und setter per default schlecht sind, das sind sie nämlich nicht, aber es bedeutet das man sich überlegen sollte wieso ich diesen getter und setter schreibe/generiere und welchen Nutzen ich davon habe. Denn oft wird ein Property im Zuge einer Tätigkeit verändert, und nicht einfach so. In einem solchen Fall sollte es eben keinen direkten public setter für das Propertie geben.

Ich gebe zu, ich bin ein Anhänger des Domain Driven Design von Martin Fowler, aber auch ich lasse bei manchen Projekten die Setter und Getter generieren ;-).

Am Ende... Das Beispiel mit dem Rechteck ist ein Schulungsbeispiel für Klassen, Methoden und Properties und nicht mehr. Man könnte sich nun Fragen: kann ein Rechteck nach dem Erstellen seine Länge oder Breite noch verändern? Und wann ist das der Fall? Und wie heisst diese Tätigkeit? Und wie gesagt... "immer" ist immer so ..... ;-)
 
Weil du "immer" geschrieben hast... Stupide getter und setter sind eine Krankheit, aber wenigstens bläht es in objective-c den Code nicht so auf.
Mit "immer" hat er hier unter Objective-C/Cocoa recht. Ausnahmen wären so gering, dass man es aus Gründen der prophylaktischen Fehlervermeidung immer machen soll, weil ansonsten hebelt man KVO und alles was dran hängt aus.
 
Zuletzt bearbeitet:
Nein, die sind kein "Syntactic Sugar". Setter und Getter generiert der Compiler für Dich, abhängig davon, wie Du die Property deklariert hast. Bei älteren Compilerversionen ist dafür noch das @synthesize erforderlich.

Die "Dot-Notation" übersetzt der Compiler übrigens direkt in das, was Du als "Syntactic Sugar" bezeichnet hast. ;) Die Dot-Notation ist der Syntactic Sugar.

Einverstanden!
Die Sache mit dem direkten Zugriff war mir im Bezug auf KVO nicht bewusst, man stolpert nur immer wieder massenhaft über solche Code-Beispiele. Da habe ich mir wohl etwas schlechtes abgeschaut und angewöhnt.

Also fleißig die Setter und Getter verwenden! ;)
 
Also Cleanen hilft auch nix xD

Und das andere soll ich ja anscheind ned nachmachen xD

Joaaa...was machen? :D
 
Ich poste hier mal den kompletten Code meines "Lösungsvorschlages" :)
Falls jmd. Änderungswünsche hat, kann er diese gerne mitteilen.

Rechteck.h

Code:
[COLOR=#0433FF]#import [/COLOR][COLOR=#B4261A]<Foundation/Foundation.h>[/COLOR]


[COLOR=#0433ff]@interface[/COLOR] Rechteck : [COLOR=#3495af]NSObject[/COLOR] {
    
    [COLOR=#0433ff]int[/COLOR] breite;
    [COLOR=#0433ff]int[/COLOR] laenge;
}


[COLOR=#0433FF]@propertyint[COLOR=#000000] breite;[/COLOR][/COLOR]
[COLOR=#0433FF]@propertyint[COLOR=#000000] laenge;[/COLOR][/COLOR]


- ([COLOR=#0433ff]int[/COLOR]) getFlaeche;


[COLOR=#0433FF]@end[/COLOR]

Rechteck.m

Code:
[COLOR=#008F00][COLOR=#0433FF]#import [/COLOR][COLOR=#B4261A]"Rechteck.h"[/COLOR][/COLOR]


[COLOR=#0433FF]@implementation[COLOR=#000000] Rechteck[/COLOR][/COLOR]




[COLOR=#0433FF]#pragma mark -[/COLOR]
[COLOR=#0433FF]#pragma mark Lange des Rechtecks[/COLOR]


- ([COLOR=#0433ff]void[/COLOR])setLaenge:([COLOR=#0433ff]int[/COLOR])nLaenge
{
    [COLOR=#3495af]laenge[/COLOR] = nLaenge;
}


- ([COLOR=#0433ff]int[/COLOR])laenge
{
    [COLOR=#0433ff]return[/COLOR] [COLOR=#3495af]laenge[/COLOR];
}


[COLOR=#0433FF]#pragma mark -[/COLOR]
[COLOR=#0433FF]#pragma mark Breite des Rechteckts[/COLOR]


- ([COLOR=#0433ff]void[/COLOR])setBreite:([COLOR=#0433ff]int[/COLOR])nBreite
{
    [COLOR=#3495af]breite[/COLOR] = nBreite;
}


- ([COLOR=#0433ff]int[/COLOR])breite
{
    [COLOR=#0433ff]return[/COLOR] [COLOR=#3495af]breite[/COLOR];
}


[COLOR=#0433FF]#pragma mark -[/COLOR]
[COLOR=#0433FF]#pragma mark Fläche des Rechtecks[/COLOR]


- ([COLOR=#0433ff]int[/COLOR])getFlaeche
{
[COLOR=#3495AF][COLOR=#0433ff]return[/COLOR]laenge[COLOR=#000000] * [/COLOR]breite[COLOR=#000000];[/COLOR][/COLOR]
}


[COLOR=#0433FF]#pragma mark -[/COLOR]
[COLOR=#0433FF]#pragma mark @synthesize[/COLOR]


[COLOR=#0433FF]@synthesize[COLOR=#000000] laenge;[/COLOR][/COLOR]
[COLOR=#0433FF]@synthesize[COLOR=#000000] breite;[/COLOR][/COLOR]


[COLOR=#0433FF]@end[/COLOR]

AppDelegate.m

Code:
[COLOR=#008F00][COLOR=#0433FF]#import [/COLOR][COLOR=#B4261A]"AppDelegate.h"[/COLOR][/COLOR]
[COLOR=#B4261A][COLOR=#0433ff]#import [/COLOR]"Rechteck.h"[/COLOR]


[COLOR=#0433FF]@implementation[COLOR=#000000] AppDelegate[/COLOR][/COLOR]


- ([COLOR=#0433ff]void[/COLOR])dealloc
{
[COLOR=#3495AF][COLOR=#000000]    [[/COLOR]_windowrelease[COLOR=#000000]];[/COLOR][/COLOR]
    [[COLOR=#0433ff]super[/COLOR] [COLOR=#3495af]dealloc[/COLOR]];
}


- ([COLOR=#0433ff]BOOL[/COLOR])application:([COLOR=#3495af]UIApplication[/COLOR] *)application didFinishLaunchingWithOptions:([COLOR=#3495af]NSDictionary[/COLOR] *)launchOptions
{


[COLOR=#3495AF][COLOR=#0433ff]self[/COLOR][COLOR=#000000].[/COLOR]window[COLOR=#000000] = [[[[/COLOR]UIWindowalloc[COLOR=#000000]] [/COLOR]initWithFrame[COLOR=#000000]:[[[/COLOR]UIScreenmainScreen[COLOR=#000000]] [/COLOR]bounds[COLOR=#000000]]] [/COLOR]autorelease[COLOR=#000000]];[/COLOR][/COLOR]
[COLOR=#3495AF][COLOR=#0433ff]self[/COLOR][COLOR=#000000].[/COLOR]window[COLOR=#000000].[/COLOR]backgroundColor[COLOR=#000000] = [[/COLOR]UIColorwhiteColor[COLOR=#000000]];[/COLOR][/COLOR]
[COLOR=#3495AF][COLOR=#000000]    [[/COLOR][COLOR=#0433ff]self[/COLOR][COLOR=#000000].[/COLOR]windowmakeKeyAndVisible[COLOR=#000000]];[/COLOR][/COLOR]


    
[COLOR=#3495AF]Rechteck[COLOR=#000000] *rechteck = [[[/COLOR]Rechteckalloc[COLOR=#000000]][/COLOR]init[COLOR=#000000]];[/COLOR][/COLOR]
    [rechteck [COLOR=#3495af]setBreite[/COLOR]:10];
    [rechteck [COLOR=#3495af]setLaenge[/COLOR]:20];
    
    [COLOR=#0433ff]int[/COLOR] flaeche = [rechteck [COLOR=#3495af]getFlaeche[/COLOR]];
[COLOR=#B4261A][COLOR=#3495af]NSLog[/COLOR][COLOR=#000000]([/COLOR]@"Die Fläche des Rechtecks beträgt: %i"[COLOR=#000000], flaeche);[/COLOR][/COLOR]
    
[COLOR=#0433FF]return[/COLOR][COLOR=#0433FF]YES[/COLOR][COLOR=#000000];[/COLOR]
}


[COLOR=#0433FF]@end[/COLOR]
 
Ist ja um einiges länger :D Gerade in Rechteck.m
 
Du kannst ja ein wenig herum experimentieren.

Gegebenenfalls kannst du die beiden Set-Methoden auch löschen! ;)