Klassenvariablen/Instanzvariablen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Klassenvariablen/Instanzvariablen

    Schönen Abend allerseits,
    ich setze mich jetzt seit einiger Zeit mit Objektive-C und Cocoa Touch auseinander. Scheitere jedoch immer an einer Sache: Ich habe eine App die eine selbstgeschriebene Klasse impplemetiert die Klasse verwaltet eigentlich nichts weiter als zwei Countdowns(realisiert mit NSTimer) dessen genaue Zeit in Sekunden festgelegt werden kann und von denen ein Countdown per Bool als einmaliger Anfangscooldown eingestuft werden kann und konvertiert diesen dann in einen NSString im Format mm:ss den man im MainViewController abrufen sollen könnte. Es kommt nämlich immer nur "null" heraus. Ich verdächtige das Thema da oben aber wirft doch mal selbst einen Blick drauf. Ich wäre für jede Hilfe dankbar.

    Hier der Header der Klasse:

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. @interface RespawnTimer : NSObject
    3. @property (assign) double iSpawnTime;
    4. @property (assign) double rSpawnTime;
    5. @property (assign) bool hasISpawn;
    6. @property (readonly) NSString* SpawnTimeString;
    7. - (void)startRespawn;
    8. - (void)resetBuff;
    9. -(id)initWithISpawn:(bool)b andISpawnTime: (double) i andRSpawnTime: (double)r;
    10. @end
    11. Hier die wichtigsten Methoden:
    12. @implementation RespawnTimer
    13. NSString* SpawnTime;
    14. double TimeRemaining;
    15. NSTimer* iSpawnT;
    16. NSTimer* rSpawnT;
    17. @synthesize iSpawnTime;
    18. @synthesize rSpawnTime;
    19. @synthesize hasISpawn;
    20. @synthesize SpawnTimeString;
    21. - (id)initWithISpawn:(bool)b andISpawnTime: (double) i andRSpawnTime: (double)r //einzigste Init
    22. {
    23. self = [super init];
    24. b=hasISpawn;
    25. i=iSpawnTime;
    26. r=rSpawnTime;
    27. return self;
    28. }
    29. - (NSString*)prepareTimeString // hier sollte aus den fertig heruntergezählten Variablen das Ergebnis zusammengesetzt werden
    30. {
    31. int gtm;
    32. int gts;
    33. if (hasISpawn==true) {
    34. gtm = floor(iSpawnTime/60);
    35. gts = round(iSpawnTime - gtm * 60);
    36. } else {
    37. gtm = floor(rSpawnTime/60);
    38. gts = round(rSpawnTime - gtm * 60);
    39. }
    40. SpawnTime = [NSString stringWithFormat:@"%d:%d",gtm, gts];
    41. NSLog(@"rtclass %@", SpawnTime);
    42. SpawnTime =SpawnTimeString;
    43. return SpawnTime;
    44. }
    45. - (void)countBuff // hier wird gezählt die Methode wird von einem wiederholenden NSTimer aufgerufen der bei Bedarf invalidiert wird
    46. {
    47. if (hasISpawn==true) {
    48. if (iSpawnTime==0) {
    49. [iSpawnT invalidate];
    50. hasISpawn=false;
    51. } else {
    52. iSpawnTime--;
    53. }
    54. } else {
    55. if (TimeRemaining==0) {
    56. [self resetBuff];
    57. } else {
    58. rSpawnTime--;
    59. [self prepareTimeString];
    60. }
    61. }
    62. }
    Alles anzeigen


    Ich bin ziemlich ratlos, hoffe ihr wisst Rat.
    Einen Schönen Abend noch :)



    edit: so besser?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Coltan ()

  • Du hast nicht zufällig Deine Grundlagen aus diesem YouTube Kanal? Deine init Methode lässt mich das vermuten, denn in dem verlinkten Kanal wird (wurde, das entsprechende Video wurde Gott sei Dank inzwischen entfernt) diese Art von Zuweisung gezeigt. Schau Dir noch mal genau an, ob diese Art der Zuweisung überhaupt Sinn ergibt.

    Michael
  • Ich habe es aus diesem Video video2brain.com/de/videotraining/apps-mit-ios-5-entwickeln sah mir ziemlich Seriös aus korregiert mich wenn ich mich irre. Ich hatte bisher immer unter Windows mit GC gearbeitet aber der Code funktioniert doch ungefähr so:

    Quellcode

    1. @property (assign) double iSpawnTime; // da wird automatisch ein setter und getter eingerichtet der setter überträgt den Wert dann 1:1
    2. @property (readonly) NSString* SpawnTimeString; // nur ein getter

    Wenn ich im Main dann wie folgt eine Instanz initialisiere:

    Quellcode

    1. RespawnTimer* X = [[RespawnTimer alloc]initWith....;

    sollte er doch Speicher für die Instanz freigeben und diese dann initieren
    Falls nicht sollte ich eventuel alles von Hand setzen? Also:

    Quellcode

    1. RespawnTimer* X = [[RespawnTimer alloc];
    2. X.(property) = Y;

    usw.
    Hab ich Recht und wenn nein warum nicht?
  • Ja aber schau dir das doch mal an und erkläre mir was da passiert. eventuell kommst du dann schon selber drauf was da falsch ist ?

    Quellcode

    1. - (id)initWithISpawn:(bool)b andISpawnTime: (double) i andRSpawnTime: (double)r //einzigste Init
    2. {
    3. self = [super init];
    4. b=hasISpawn;
    5. i=iSpawnTime;
    6. r=rSpawnTime;
    7. return self;
    8. }


    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • ............................................________
    ....................................,.-'"...................``~.,
    .............................,.-"..................................."-.,
    .........................,/...............................................":,
    .....................,?......................................................,
    .................../...........................................................,}
    ................./......................................................,:`^`..}
    .............../...................................................,:"........./
    ..............?.....__.........................................:`.........../
    ............./__.(....."~-,_..............................,:`........../
    .........../(_...."~,_........"~,_....................,:`........_/
    ..........{.._$;_......"=,_......."-,_.......,.-~-,},.~";/....}
    ...........((.....*~_......."=-._......";,,./`..../"............../
    ...,,,___.`~,......"~.,....................`.....}............../
    ............(....`=-,,.......`........................(......;_,,-"
    ............/.`~,......`-...................................../
    .............`~.*-,.....................................|,./.....,__
    ,,_..........}.>-._...................................|..............`=~-,
    .....`=~-,__......`,.................................
    ...................`=~-,,.,...............................
    ................................`:,,...........................`..............__
    .....................................`=-,...................,%`>--==``
    ........................................_..........._,-%.......

    Quellcode

    1. - (id)initWithISpawn:(bool)b andISpawnTime: (double) i andRSpawnTime: (double)r //einzigste Init
    2. {
    3. self = [super init];
    4. b=hasISpawn;
    5. i=iSpawnTime;
    6. r=rSpawnTime;
    7. return self;
    8. }


    edit: funktioniert allerdings immer noch nicht :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Coltan ()

  • Kunststück, du hast ja auch nichts verändert...

    Es ist ja schön und gut, dass du Setter und Getter hast.
    Warum benutzt du sie nicht?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Kunststück, du hast ja auch nichts verändert...

    Es ist ja schön und gut, dass du Setter und Getter hast.
    Warum benutzt du sie nicht?

    Die Verwendung von Accessoren im -init… ist aber streitig und Apple empfiehlt es nicht.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • öhm bin ich jetzt der einzige der es merkwürdig findet das er den Methodenparametern den Wert der Instanzvariablen zuweist und nicht anders herum. Oder verstehe ich nur einen viel tieferen Sinn dahinter nicht ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Coltan schrieb:

    Amin Negm-Awad schrieb:

    Die Verwendung von Accessoren im -init… ist aber streitig und Apple empfiehlt es nicht.


    Wie empfiehlt Apple es denn?

    Die direkte Zuweisung, wobei du dann abhängig vom Typen der Property ein copy machen musst. Das ist dann auch der Einwand dagegen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Lucas de Vil schrieb:

    Kunststück, du hast ja auch nichts verändert...

    Es ist ja schön und gut, dass du Setter und Getter hast.
    Warum benutzt du sie nicht?

    Die Verwendung von Accessoren im -init… ist aber streitig und Apple empfiehlt es nicht.

    Warum empfiehlt Apple es denn nicht?

    Thallius
    Spielverderber.
    Bei einem self.i = iSpawnTime; hätte Xcode so schön gemeckert und den guten Mann noch viel mehr verwirrt. -.-
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Amin Negm-Awad schrieb:

    Lucas de Vil schrieb:

    Kunststück, du hast ja auch nichts verändert...

    Es ist ja schön und gut, dass du Setter und Getter hast.
    Warum benutzt du sie nicht?

    Die Verwendung von Accessoren im -init… ist aber streitig und Apple empfiehlt es nicht.

    Warum empfiehlt Apple es denn nicht?

    Thallius
    Spielverderber.
    Bei einem self.i = iSpawnTime; hätte Xcode so schön gemeckert und den guten Mann noch viel mehr verwirrt. -.-

    Das sagt Apple nicht. Das allgemein verbreitete Argument ist indessen, dass der Setter in einer Subklasse überschrieben sein könnte und dann der Subklassensetter ausgeführt wird, obwohl die Subklasse noch nicht die Gelegenheit hatte, sich zu initialisieren.

    Dann müsste man eigentlich alle Methoden in -init… verbieten, was die Sache ein wenig lächerlich macht.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Thallius schrieb:

    öhm bin ich jetzt der einzige der es merkwürdig findet das er den Methodenparametern den Wert der Instanzvariablen zuweist und nicht anders herum. Oder verstehe ich nur einen viel tieferen Sinn dahinter nicht ?

    Gruß

    Claus

    Guter Hinweis.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ich habe es jetzt noch mal angeschaut und komme nicht weiter, als neuling ist Freundlichkeit ja das letzte was ich erwarte, aber villeicht mal zwischen all den vagen Andeutungen nen Tipp? Fänds auch völlig ok wenn er zwischen 10 weiteren vagen Andeutungen versteckt wäre und ich ihn suchen müsste aber er wäre schon schön :)
  • Coltan schrieb:

    So war es ja ursprünglich aber Thallius Post hat mich daraufhin verunsichert das ich erst so gemacht habe.

    Dein Einstiegsposting erzählt etwas völlig Anderes. Nämlich, dass du es dort genau so gemacht hast.
    Thallius hat dich nur zitiert, mehr nicht.

    Warum es bei dir auch anders herum nicht geht?
    Ich sage, weil du keine Setter benutzt.
    Amin sagt, im -init* sollte man keine Setter benutzen.
    Nichts desto weniger findet absolut überhaupt gar nichts statt, was die Referenz auf die Parameter mit den dämlichen Namen irgendwie am Leben erhält.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P