Zugriff auf Variable von überall

  • Original von klause85
    Das bezog sich nicht auf alle.
    Wie gesagt, ich hab was "Einführendes" (liegt wie immer im Auge des Betrachters, wie man das definiert) gelesen. Wenn für euch das nur "das" Buch ist, sagt das. Desweiteren hab ich mir erlaubt eure kostbare Zeit erst dann in Anspruch zu nehmen, wenn ich auch ausführlich danach im Internet gesucht habe, nichts gefunden habe und auch alle Versuche gescheitert sind. Wenn euch das zu viel ist, wieso antwortet ihr hier? Spart euch eure Zeit lieber. Ich hab auch nirgends einen Einstiegskurs gefordert, ich hab eine konkrete Frage gestellt.
    Bisher hab ich die Erfahrung gemacht, dass man auch kostenlos Hilfe bekommen (und geben) kann, auch bei noch so (in manchen Augen) beknackten Fragen. Aber anscheinend nicht hier.

    Niemand sagt, dass du mein Buch lesen sollst. Du sollst $irgendwas Vertrauenserweckendes lesen. cocoa-coding.de gehört ganz gewiss nicht dazu. Das konntest du nicht wissen. Aber es hätte dir hier auffallen können.

    Und ja: Die Definition von Propertys ist ganz einführend. Das steht übrigens auch bei Apple, was du ja gelesen hast.
    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"?
  • off-topic: vielleicht sollte hier mancher teilnehmer nicht vergessen, dass es nicht nur ziemlich doofe fragen, sondern auch super-blöde antworten gibt!

    klauses fähigkeiten und die eine und andere seiner hohlen antworten einmal außen vor, aber anhand der frage kann man 'natürlich' erkennen das es hier um grundlagen bzw. um euer sogenanntes 'einführende' geht. ich frage mich allerdings, warum hier jedes mal so ein klugscheißer-drama draus wird...

    vielleicht wäre es hilfreicher das jene, die hier (leider) so oft auch am lautesten sind, ihre energie in das schreiben von weiteren (und vielleicht ebenfalls guten) wiki-artikeln für dieses forum investieren (e.g. Link ). dann reichet dann vielleicht künftig ein sinnvoller textbaustein für den themenersteller und ein link gen euer einsteiger-wiki - cocoa-coding.de sei da ja nicht 'vertrauenserweckend'! am ende könnte dann einer der moderatoren hier so einen thread auch schlicht ganz schließen.

    mensch, dass die ersten vier antworten zum thema den themenersteller 'natürlich' eher überfordern, war vermutlich sogar den meisten schon beim schreiben ihrer (jedoch sehr wohl korrekten) antworten klar. leider hindert es nur eben keinen von euch, am ende auf 'antwort erstellen' zu klicken.

    und kommentare, wie z.b.

    Das siehst du falsch. Ich kann dir sagen, was du mit einem obertollen Buch anfangen kannst: Nicht die Zeit und das Wissen anderer kostenlos in Anspruch nehmen.


    kann man(n) sich auch getrost schenken!

    es soll doch eben 'keine schande sein, nichts zu wissen, wohl aber, nichts lernen zu wollen' und wie es gelernt wird, steht m.e. erst einmal gar nicht zur debatte. gebt den leuten aber auch mal eine chance dazu, als immer nur deren fehler und auf missstände aufmerksam zu machen.

    eine profunde und inhaltlich korrekte antwort ist manches mal sicherlich nicht notwendiger weise die einzig richtige und dieser thread zeigt das in erschreckender deutlichkeit.

    na ja, meine fünf cent, aber ihr macht das schon!

    @moderator: kann man den mist hier nicht endlich schließen?
  • Original von klause85
    Dass ihr gleich so pampig werden müsst (Pascal, SumpfMonster) kann ich da nicht nachvollziehen...

    Sorry, das sollte nicht pampig rüberkommen. Klar, ich hab "so einen Unsinn" hingeschrieben, ich wollte dich damit aber nicht wütend machen, sondern einfach darauf hinweisen, dass deine Ansicht, wenn es im Internet nichts gescheites gibt auch ein Buch nicht mehr her gibt, doch ziemlich verkehrt ist. Eigentlich solltest du dir ein Buch kaufen, gerade weil das Internet nichts besseres her gibt. ;)
    Widgetschmie.de • Life is too short for gadgets
  • err, 'bringschuld'?

    das hier ist ein öffentliches forum, dass auf absoluter 'freiwilligkeit' basiert! DU mußt hier überhaupt nichts erbringen - nein, auch nicht das, was vielleicht deiner meinung nach unnötig scheint. sogar nicht einmal das, was deiner ansicht nach nötig sei!

    [ohne mich hier jedoch anbieten zu wollen!]

    ich halte die umsetzung der idee ein ausführliches (deutschsprachiges) 'faq' aus den vielen und vielen faq's des forums hier zu erstellen, für durchaus sinnvoll. das würde einem nämlich das 'drama' hier ersparen und dem anfänger am ende noch wirklich etwas bringen! es gibt doch zum beispiel auch sprachliche barrieren und gerade hier macht dieses 'sammelbecken' doch eben seinen kleinen aber feinen unterschied oder? nochmal: seiten wie cocoa-coding.de sind ja eben NICHT vertrauenserweckend (<- drauf rumreit; oh, und nein, ich hab mit dem laden da nichts am hut)!

    oh und bücher gibts auch ne menge, richtig! aber die allerwenigsten sind dann für jeden gleich gut geeignet, nicht erdrückend ausführlich, bieten so eine stete balance zwischen treibender motivation und gebotenem wissen und erreichen es, das alles möglichst ohne zeichen großer frustration an den mann zu bringen. gute (deutschpsrachige) cocoa literatur IST rar - auch im internet!

    nevermind. ich misch mich hier in dinge, die mich nichts angehen! und für alle anderen gibts ja auch noch Link (englischsprachig). die wirken beileibe noch a bissel schmerzbefreiter als manche von uns hier.

    42
    und weitermachen :P

    post scriptum: und für einsteiger ist dieser videocast vielleicht mal eine ganz nette abwechslung, wenn es um die grundlagen geht: XCode von 0 auf 100 (deutschsprachig).
  • Deinen Optimismus in allen Ehren, ich persönlich denke, dass ein Einsteigerwiki auch bloss nicht gelesen würde. Die vorhandene deutschsprachige Literatur wäre absolut ausreichend gewesen, um dem TE weiterzuhelfen (Adam und Eva: ivars, getter/setter, properties).

    Ich verstehe, dass für manchen Einsteiger Apples Doku zu trocken ist oder Sprachbarrieren bestehen. Ich bin dann der letzte, der in diesem Fall nicht weiterhilft. Die verfügbare Einsteigerliteratur ist sehr gut und mit ein bisschen Lernwillen sind die ersten Hürden schnell überwunden.

    Hier gibt es eine gute Übersicht (3sekunden Google-Suche):
    Link

    Es ist allerdings NICHT Aufgabe dieses Forums, Einsteiger bei der Hand zu nehmen und ihnen einen kostenlosen Kurs zu geben. Diverse Autoren haben sich viel Mühe gemacht, Einsteiger bei Null abzuholen, die Bücher sind didaktisch gut aufbereitet und kosten wirklich nicht die Welt (ausserdem soll es ja noch so etwas wie Bibliotheken geben).

    Dass darauf hingewiesen wird, damit musst Du leben. Zu fordern, dass die alten Hasen ihre Zeit in ein Wiki stecken, ist angesichts der oben beschriebenen Literatur/Weblinks unnötig.
  • ich lass die diskussion jetzt einfach. sorry, falls sich jemand angepisst gefühlt hat, war nicht meine Absicht. Wollte halt in kurzer Zeit was erreichen, da es damit bei mir derzeit ein wenig knapp aussieht. Vielleicht war das Codebeispiel auch nicht gerade das beste, ich hatte es vorher auch schon mit manuellen gettern und settern, aber das ging dann auch nicht und dann wollt ich nimmer :)

    ich hab mich ein bisschen weiter eingelesen, hab aber noch ein paar fragen dazu.
    Meine ProgramAppDelegate.h sieht jetzt so aus

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. #import "Group.h"
    3. @interface ProgramAppDelegate : NSObject <NSApplicationDelegate> {
    4. NSWindow *window;
    5. Group *gruppe;
    6. }
    7. @property (assign) Group *gruppe;
    8. @property (assign) IBOutlet NSWindow *window;
    9. @end
    Alles anzeigen
    das sollte so jetzt ja stimmen? Hab ich das richtig verstanden, dass ich die Variablen zwischen die geschweiften Klammern und dann zusätzlich nochmal außerhalb aufführen muss? Also nur außerhalb reicht nicht? Innerhalb würde reichen, dann kann ich die aber nicht mehr verändern, korrekt? Die ProgramAppDelegate.m sieht so aus

    Quellcode

    1. #import "ProgramAppDelegate.h"
    2. #import "Group.h"
    3. @implementation ProgramAppDelegate
    4. @synthesize window, gruppe;
    5. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    6. // Insert code here to initialize your application
    7. }
    8. @end
    Alles anzeigen
    das @synthesize erstellt mir ja jetzt automatisch die Methoden gruppe und setGruppe, korrekt? Dazu hab ich leider im Buch nix gefunden.
    Wenn ich jetzt aber die Gruppe bekommen will per [[NSApp delegate] gruppe] erzählt er mir, dass er die -gruppe Methode nicht kennt. Ich hab auch schon die Methoden manuell erstellt -(Group *)gruppe{return gruppe;}, aber da kommt die gleiche Warnung
  • Original von klause85
    das sollte so jetzt ja stimmen? Hab ich das richtig verstanden, dass ich die Variablen zwischen die geschweiften Klammern und dann zusätzlich nochmal außerhalb aufführen muss? Also nur außerhalb reicht nicht? Innerhalb würde reichen, dann kann ich die aber nicht mehr verändern, korrekt?

    Der Code stimmt so. Du musst die "innerhalb und ausserhalb" der Klammern deklarieren, weil:
    • Innerhalb der Klammern kommen die Instanz-Variablen, die definierst du dort
    • Ausserhalb kannst du Properties definieren, welche immer eine dazugehörige Instanzvariable benötigen. Lies mehr zu Properties.
    Verändern kannst du Instanzvariablen auch ohne Properties, natürlich. Lies was zu Instanzvariablen. ;)

    Original von klause85das @synthesize erstellt mir ja jetzt automatisch die Methoden gruppe und setGruppe, korrekt?

    Ja, genau.

    Original von klause85
    Wenn ich jetzt aber die Gruppe bekommen will per [[NSApp delegate] gruppe] erzählt er mir, dass er die -gruppe Methode nicht kennt.

    Das ist klar. Schau dir die Dokumentation von NSApp und dessen Methode "delegate" an. Diese Methode gibt ein untypisiertes Objekt (eine id) zurück. Der Compiler weiss also nicht, was für ein Objekt das ist, und deshalb weiss er auch nicht dass (oder dass nicht) dieses Objekt auch die Methode "gruppe" kennt. Das musst du ihm also sagen:

    Quellcode

    1. ProgramAppDelegate *myDelegate = (ProgramAppDelegate *)[NSApp delegate];
    2. myDelegate.gruppe = irgendEineGruppe;


    Nach der ersten Zeile weiss der Compiler nun, was für ein Element "myDelegate" nun ist und kann nachsehen, welche Properties/Methoden es besitzt. :)
    Widgetschmie.de • Life is too short for gadgets
  • danke soweit
    Original von Pascal
    Verändern kannst du Instanzvariablen auch ohne Properties, natürlich. Lies was zu Instanzvariablen. ;)
    werd ich machen, ich nehm aber mal an über Methoden?

    Quellcode

    1. Group *c = [[Group alloc]init];
    2. [c setName:[groupName stringValue]];
    3. ProgramAppDelegate *myDelegate = (ProgramAppDelegate *)[NSApp delegate];
    4. [myDelegate setGruppe:c];
    5. NSLog(@"%@",[[myDelegate gruppe] name]);
    Er gibt mir in der Konsole null aus. Liegt das an der fehlenden Speicherverwaltung (die hab ich bis jetzt noch auf der Seite liegen gelassen...) oder ist sonst irgendwo ein Fehler drin?
  • Original von klause85

    Quellcode

    1. NSLog(@"%@",[[myDelegate gruppe] name]);

    Er gibt mir in der Konsole null aus. Liegt das an der fehlenden Speicherverwaltung (die hab ich bis jetzt noch auf der Seite liegen gelassen...) oder ist sonst irgendwo ein Fehler drin?

    Er müsste dir dasselbe ausgeben wie [groupName stringValue]. Was steht denn dort drin? Logge dies auch mal.
    Widgetschmie.de • Life is too short for gadgets
  • Hallo,

    Zeile 1:
    Potenzielles Memory Leak
    In Cocoa/Objecite-C ist es üblich Variablennamen ausführlich zu benennen.
    -stringValue holt den Wert von wo? Bitte nur mal dies loggen.
    Möglicherweise hast Du auch ein Outlet vergessen. Bzw. hast Du die Methode geschrieben? Ist der Getter vielleicht fehlerhaft?
    Woher kommt "groupName"?

    Zeile 4:
    Würde ich id verwenden - einer meiner seltenen Fälle.

    Zeile 6:
    Solltest Du überprüfen, ob "myDelegate" auch eine Methode "setGruppe" bereitstellt. Siehe dazu "respondsToSelector"

    Deutsch und Englisch im Code zu mischen halte ich für nicht gerade toll. Meines Erachtens gehört da nur Englisch rein.

    Viele Grüße
  • Original von little_pixel
    Zeile 4:
    Würde ich id verwenden - einer meiner seltenen Fälle.

    Zeile 6:
    Solltest Du überprüfen, ob "myDelegate" auch eine Methode "setGruppe" bereitstellt. Siehe dazu "respondsToSelector"

    Lies doch mal die vorherigen Einträge, dann weisst du auch, warum wir nicht "id" verwenden und warum wir wissen, dass myDelegate eine readwrite property "gruppe" hat. ;)
    Widgetschmie.de • Life is too short for gadgets
  • Lies doch mal die vorherigen Einträge

    Stimmt, habe ich nicht getan. ;) Grund dafür war das Zeugs zuvor.

    Aber ich finde Deinen Vorschlag einen Cast durchzuführen "falsch", da er nicht dynamisch flexibel ist und in Zukunft fehlerhaft sein kann. (bitte nicht als Angriff werten)
    id ist absolut korrekt und auch die angeblich unbekannte Methode kann mit -respsons… und -perform… korrekt angewandt werden.

    Ach ja, und sein property "gruppe" mit assign ist vermutlich nicht korrekt
    Aber ich weiß nicht in welchen Zusammenhang das steht.

    Viele Grüße
  • Original von little_pixel
    Aber ich finde Deinen Vorschlag einen Cast durchzuführen "falsch", da er nicht dynamisch flexibel ist und in Zukunft fehlerhaft sein kann. (bitte nicht als Angriff werten)
    id ist absolut korrekt und auch die angeblich unbekannte Methode kann mit -respsons… und -perform… korrekt angewandt werden.

    Nö, sehe ich nicht als Angriff. Der Cast ist einzig und allein dort, um dem Compiler mitzuteilen, welche Klasse der App Delegate hat. Ein respondsToSelector ist dort überflüssig und fügt dem Code overhead hinzu. Was meinst du denn mit "nicht dynamisch flexibel" und wieso sollte das plötzlich fehlerhaft werden?
    Widgetschmie.de • Life is too short for gadgets
  • er Cast ist einzig und allein dort, um dem Compiler mitzuteilen, welche Klasse der App Delegate hat.

    Ja, der Sinn erschließt sich mir.

    Du "weißt nicht", ob zur Laufzeit immer diese Instanz X gerade das Delegate ist.
    Bei mir z.B. gibt es da eine Dynamik. Auch in Zukunft kann sich der Code an anderen Stellen ändern und er diese Stelle vergisst nachzufplegen (höchst wahrscheinlich).
    -respondsToSelector wäre für mich die Sicherheit vor dem -performOn…

    Ich gebe Dir insofern Recht, dass vermutlich für sein kleines Projekt der Cast alles im vollem Umfang abdeckt.
    Wahrscheinlich ist es zu Beginn auch erst besser für ihn. Hast Du Recht :)

    Viele Grüße
  • Original von little_pixel
    Du "weißt nicht", ob zur Laufzeit immer diese Instanz X gerade das Delegate ist.
    Bei mir z.B. gibt es da eine Dynamik.

    Bei Delegates generell hast du schon Recht, er benutzt hier aber den App Delegate - dass sich die Klasse desselben ändert ist doch eher selten, oder seh ich das falsch? Insbesondere zur Runtime. :)
    Widgetschmie.de • Life is too short for gadgets
  • groupName ist ein Outlet eines NSTextField.
    2009-11-25 10:14:03.816 Program[74762:a0f] [groupName stringValue]: adasd
    2009-11-25 10:14:03.819 Program[74762:a0f] [[myDelegate gruppe] name]: (null)

    wieso könnte das assign von "gruppe" nicht korrekt sein? wobei ich zugeben muss, dass ich mir die Speicherverwaltung noch genauer ansehn muss, da steig ich noch ned durch, was assign und retain groß anders machen
  • Original von klause85
    wieso könnte das assign von "gruppe" nicht korrekt sein? wobei ich zugeben muss, dass ich mir die Speicherverwaltung noch genauer ansehn muss, da steig ich noch ned durch, was assign und retain groß anders machen

    Dringend. :)
    Darauf bin ich gar nicht eingegangen, aber wie auch little_pixel schon erwähnt hat, Speichertechnisch läuft da noch einiges falsch. Lies darüber lieber etwas komplettes, hier im Forum kriegst du immer nur stückchenweise Infos.

    Du kannst jetzt noch weiter debuggen, vor allem schauen ob denn [myDelegate gruppe] nicht etwa auch null ist.
    Widgetschmie.de • Life is too short for gadgets