Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: OS X Entwicklerforum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Donnerstag, 26. April 2012, 12:29

Header Definition: Unterschied Variablen und Properties, bzw. IBOutlets nur als Property, nur als Variable oder beides?

Hi

Ich bin gerade am Durcharbeiten eines Objective C Buchs. Was ich nicht ganz verstehe ist, was der Unterschied ist wenn ich zbsp. das window als Variable und/oder als Eigenschaft deklariere. Es funktioniert auch alles wenn ich es nur als Property deklariere.
Und dann was ist der Unterschied ob ich ein IBOutlet zwischen den geschweiften Klammern deklariere, wenn ichs nur als Property deklariere oder wenn ichs an beiden Orten deklariere?

Sorry stehe da auf dem Schlauch...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@interface AppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    
    TaxiFareCalculator *calculator;
}


@property (retain) IBOutlet NSWindow *window;
@property (retain) IBOutlet NSTextField *sliderValueLabel;
@property (retain) IBOutlet NSButton *checkIsNightTour;
@property (retain) IBOutlet NSButton *checkIsHolidaytour;
@property (retain) IBOutlet NSButton *checkHasLuggage;
@property (retain) IBOutlet NSTextField *taxiFarePrice;


- (IBAction)sliderDidMove:(id)sender;
- (IBAction)checkBoxDidChange:(id)sender;


@end

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

2

Donnerstag, 26. April 2012, 12:34

Erst einmal gibt es keinen Unterschied, wenn du @synthesize verwendest. Das erzeugt nämlich eine Ivar.

Und wenn es mal anders ist, dann schreibst du die Ivars bitte auch nicht mehr in den Header. (Extrem seltene Ausnahmen beiseite gelassen.)

Das hat nur noch historische Gründe.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

Beiträge: 4 331

Wohnort: Ruhrgebiet, NRW

Beruf: Mac Indie / Freelancer

  • Private Nachricht senden

3

Donnerstag, 26. April 2012, 12:57

Wurden die passenden Variablen zu einem Property eigentlich schon immer automatisch erzeugt oder ist dies erst seit einer gewissen Xcode-, Compiler- oder SDK Version der Fall?

Wieso sollte man die Ivars nicht mehr im Header deklarieren?

4

Donnerstag, 26. April 2012, 13:01

Das ist seit @synthesize der Fall. ^^

Vermutlich kann man dann unter Umgehung der Setter und Getter an die iVars, und das will ja bekanntlich keiner.
Hilfreich? Dann freue ich mich über eine kleine Spende. :) Flattr this
----
«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
----

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

5

Donnerstag, 26. April 2012, 13:11

Wurden die passenden Variablen zu einem Property eigentlich schon immer automatisch erzeugt oder ist dies erst seit einer gewissen Xcode-, Compiler- oder SDK Version der Fall?

Wieso sollte man die Ivars nicht mehr im Header deklarieren?

Das ist seit @synthesize der Fall. ^^

Vermutlich kann man dann unter Umgehung der Setter und Getter an die iVars, und das will ja bekanntlich keiner.

Jein

In den ersten Implementierungen hat @synthesize zwar die Ivars angeklebt, aber keinen Bezeichnet dafür herausgerückt. Das führte dazu, dass man in -init und -dealloc die Setter verwenden musste. :-] Einige hat das böse gemacht, so dass jetzt auch Bezeichnet erzeugt werden.

Zum Header: Weil sie da nichts verloren haben. Sie sind ja Implementierungsdetail.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

6

Donnerstag, 26. April 2012, 13:24

Also erstmal vielen Dank. Was sind denn Ivar? Einfach Variablen?

Und wenn ichs richtig verstanden habe, gibts also keinen Zweck mehr Variablen im Header zu deklarieren, ausser eben man will keine Getter und Setter über die Properties automatisch generieren lassen oder?

In meinem Buch steht nämlich zu dieser doppelten Deklaration vom Window Objekt:

Zitat

Der Bezeichner window dient als Zeiger auf das Programmfenster.
Aber den Bezeichner hat man ja auch über die Properties… ?(

Ah ja und noch eine Frage die teils dazu passt. Wenn ich ein IBOutlet direkt vom Interface Builder auf die Header Datei ziehe, fügt XCode (weak) als Argument hinter property an. Ich kenne allerdings nur retain, assign und copy, und standardmässig bei Objekten macht ja (so wie ichs verstanden habe) retain am meisten Sinn. Wieso fügt Xcode weak ein und was bedeutet es?

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

7

Donnerstag, 26. April 2012, 13:38

Also erstmal vielen Dank. Was sind denn Ivar? Einfach Variablen?

Und wenn ichs richtig verstanden habe, gibts also keinen Zweck mehr Variablen im Header zu deklarieren, ausser eben man will keine Getter und Setter über die Properties automatisch generieren lassen oder?

In meinem Buch steht nämlich zu dieser doppelten Deklaration vom Window Objekt:

Zitat

Der Bezeichner window dient als Zeiger auf das Programmfenster.
Aber den Bezeichner hat man ja auch über die Properties… ?(

Ah ja und noch eine Frage die teils dazu passt. Wenn ich ein IBOutlet direkt vom Interface Builder auf die Header Datei ziehe, fügt XCode (weak) als Argument hinter property an. Ich kenne allerdings nur retain, assign und copy, und standardmässig bei Objekten macht ja (so wie ichs verstanden habe) retain am meisten Sinn. Wieso fügt Xcode weak ein und was bedeutet es?

Ivars sind Instanzvariablen, also solche, die pro Objekt existieren. Sollte aberin jedemBuch erklärt werden.

Übrigens ist das Zitat etwas schräg. Bezeichner bezeichnen etwas im Sourcecode. Die Instanzvariable ist der Zeiger auf das Programmfenster. Mit dem Bezeichner kommst du bloß im Source-Code an die Ivar.

Das weak gehört zu der neuen Speicherverwaltung. Auch dazu sollte etwas im Buch stehen.

Welches Buch ist das?
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

8

Donnerstag, 26. April 2012, 14:18

Hm also das Buch heisst Objective - C und Cocoa, Praxiseinstieg Programmierung für Mac OS X und iphone, von 2011.

Also zu weak stand leider gar nichts, obwohl die Properties abgehandelt wurden..

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

9

Donnerstag, 26. April 2012, 14:20

Objective - C und Cocoa, Praxiseinstieg Programmierung für Mac OS X und iphone, von 2011

Ich sage zu dem Buch nichts. Es sagt dir auch nichts.

Bist du noch in der Widerrufsfrist?
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

10

Donnerstag, 26. April 2012, 14:21

Objective - C und Cocoa, Praxiseinstieg Programmierung für Mac OS X und iphone, von 2011

Ich sage zu dem Buch nichts. Es sagt dir auch nichts.

Bist du noch in der Widerrufsfrist?
Du sagst nix ? ;)

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

11

Donnerstag, 26. April 2012, 14:22

Objective - C und Cocoa, Praxiseinstieg Programmierung für Mac OS X und iphone, von 2011

Ich sage zu dem Buch nichts. Es sagt dir auch nichts.

Bist du noch in der Widerrufsfrist?
Du sagst nix ? ;)

Okay, dann formuliere ich es anders: Ich sage nicht das, was ich davon halte.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

12

Donnerstag, 26. April 2012, 14:23

Objective - C und Cocoa, Praxiseinstieg Programmierung für Mac OS X und iphone, von 2011

Ich sage zu dem Buch nichts. Es sagt dir auch nichts.

Bist du noch in der Widerrufsfrist?
Du sagst nix ? ;)

Okay, dann formuliere ich es anders: Ich sage nicht das, was ich davon halte.
Du sagst nix, was Du davon hälst? Komm schon, das Eis wird jetzt ganz schön dünn ;)

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

13

Donnerstag, 26. April 2012, 14:24

Nein, ich sage nichts dazu, ich sage nichts dazu.

Ich finde es übrigens gut, dass es einen Verbraucherwiderruf im Internet gibt.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

14

Donnerstag, 26. April 2012, 14:25

Nein, ich sage nichts dazu, ich sage nichts dazu.

Ich finde es übrigens gut, dass es einen Verbraucherwiderruf im Internet gibt.
Das nenn ich mal ne klare Aussage !

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

15

Donnerstag, 26. April 2012, 14:26

Nein, ich sage nichts dazu, ich sage nichts dazu.

Ich finde es übrigens gut, dass es einen Verbraucherwiderruf im Internet gibt.
Das nenn ich mal ne klare Aussage !

Vielleicht findet ja noch jemand einen Beleg imInternet.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

Beiträge: 4 331

Wohnort: Ruhrgebiet, NRW

Beruf: Mac Indie / Freelancer

  • Private Nachricht senden

16

Donnerstag, 26. April 2012, 14:30

Wurden die passenden Variablen zu einem Property eigentlich schon immer automatisch erzeugt oder ist dies erst seit einer gewissen Xcode-, Compiler- oder SDK Version der Fall?

Wieso sollte man die Ivars nicht mehr im Header deklarieren?

Das ist seit @synthesize der Fall. ^^

Vermutlich kann man dann unter Umgehung der Setter und Getter an die iVars, und das will ja bekanntlich keiner.

Jein

In den ersten Implementierungen hat @synthesize zwar die Ivars angeklebt, aber keinen Bezeichnet dafür herausgerückt. Das führte dazu, dass man in -init und -dealloc die Setter verwenden musste. :-] Einige hat das böse gemacht, so dass jetzt auch Bezeichnet erzeugt werden.

Was habe ich darunter zu verstehen? ?(

Zum Header: Weil sie da nichts verloren haben. Sie sind ja Implementierungsdetail.

Ok, leuchtet unter Berücksichtigung der Kapselung ein bringt aber sonst keine Vorteile, Änderungen etc., oder?

Dann sollte man sicherlich auch keine Proerties für Ivars in Header anlegen, welche von aussen nicht zugänglich sein sollen, richtig?

Ich muss dann also in jedem .m File für meine privaten Ivars z.B. noch folgenden Block packen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
@interface MyViewController (Private)

@property (nonatomic, retain) NSArray *privateArray;
@property (nonatomic, retain) NSString *privateString;

@end

@implementation MyViewController

@synthesize privateArray;
@synthesize privateString;
...

oder gibt es dafür mittlerweile eine einfachere und/oder elegantere Lösung?

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

17

Donnerstag, 26. April 2012, 14:36

Zu 1
Eine Zeit lang war es so, dass ein @property-@synthesize-Paar zwar Getter-Setter-Ivar erzeugt hat, aber der Compiler kannte nur die Bezeichner für den Getter und den Setter. Hast du versucht, eine synthetisierte Ivar anzusprechen, gab es ein "Undeclared identififier" oder so . Damit gint das nicht mehr:

Quellcode

1
2
3
4
- (void)dealloc 
{
   [ivar release];
}


Und man musste machen;

Quellcode

1
2
3
4
- (void)dealloc 
{
   self.ivar = nil;
}


Zu 2
Doch, Propertys sollen von außen benutzt werden. Wenn du eine Property hast, die nicht von außen benutzt werden soll, dann schreibst du sie auch nicht in den Header. Kapselung ist nicht ein Extra bei OOP, sondern der Sinn und Zweck.

Es gibt inzwischen eine einfachere Methode:

Quellcode

1
2
3
4
5
@implementation Somewhat {
  // Private ivars
}
…
@end
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

18

Donnerstag, 26. April 2012, 14:45

So schlecht? Welches ist denn zu empfehlen? Programmieren hab ich e mit Java gelernt, also mir geht es mehr um die Unterschiede und wie es sich alles bei Objective C verhält.
Und jetzt hab ichs kapiert, mittlerweile reichen die properties und erzeugen gleich ne IVar. Und klar Instanzvariable ist erklärt, nur der Begriff IVar nicht :-)

Aber hast du irgendnen Link zu dieser weak Erklärung?

Beiträge: 4 331

Wohnort: Ruhrgebiet, NRW

Beruf: Mac Indie / Freelancer

  • Private Nachricht senden

19

Donnerstag, 26. April 2012, 14:49

Also bei:

Quellcode

1
2
3
4
@implementation Somewhat
{
  NSString *privateString;
}

erhalte ich die Fehlermeldung:
3: Inconsistent instance variable specification

Bei:

Quellcode

1
2
3
4
@implementation Somewhat

@property (nonatomic, retain) NSString *privateString;
@synthesize privateString;

gibt es die Fehlermeldungen:
3: Property cannot be declared inside @implementation context
4: No declaration of property 'myString' found in the interface

Ich gehe jetzt mal davon aus, dass dies unter Xcode 3.x und dem GCC 4.x noch nicht funktioniert, sondern erst ab Xcode 4.x oder unter Verwendung von LLVM als Compiler zur Verfügung steht, richtig?

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

20

Donnerstag, 26. April 2012, 15:12

Also bei:

Quellcode

1
2
3
4
@implementation Somewhat
{
  NSString *privateString;
}

erhalte ich die Fehlermeldung:
3: Inconsistent instance variable specification

Bei:

Quellcode

1
2
3
4
@implementation Somewhat

@property (nonatomic, retain) NSString *privateString;
@synthesize privateString;

gibt es die Fehlermeldungen:
3: Property cannot be declared inside @implementation context
4: No declaration of property 'myString' found in the interface

Ich gehe jetzt mal davon aus, dass dies unter Xcode 3.x und dem GCC 4.x noch nicht funktioniert, sondern erst ab Xcode 4.x oder unter Verwendung von LLVM als Compiler zur Verfügung steht, richtig?

Das gibt es erst seit 10.7. Das ist richtig.

Aber inkontinente Ivars finde ich gut. Die leaken bestimmt.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

Social Bookmarks