Breitis blöde-Fragen-Thread

  • Es empfiehlt sich in der Regel nicht, in seiner Datenstruktur selbst Mutables zu nehmen. Wenn man wirklich selbst hinzufügen will, kann man das so machen:

    Quellcode

    1. @interface ... {
    2. NSDictionary* _myDict;
    3. }

    Quellcode

    1. - (NSDictionary*)myDict { ...}
    2. - (void)setMyDict:(NSDictionary*)newDict { ... }
    3. NSMutableDictionary* addDict = [[self myDict] mutableCopy];
    4. [addDict addObject:... forKey:...];
    5. [self setMyDict:addDict];

    Grund: Wenn du Mutables "auslieferst", kann es passieren, dass Dritte daran "herumpfuschen". Das ist das gleiche Problem wie bei Mutable-Strings. Du kannst das auch nicht durch Observierung lösen. Ganz gefährliche Sache!

    Die Controller von Cocoa kommen auch mit Immutables zurecht, machen es also offenbar genauso.
    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"?
  • Original von chartus
    hm vllt ist dein ganzes Problem ja nur das du NSArray und NSDictionary nach der initialisierung mit daten nciht mehr verändern kannst?
    ...
    wars das was du suchst?


    nein, ich nutze Mutables, mein problem ist eher das ich nicht weiß wie ich ein array das in einer Klasse liegt an ein Arraycontroller und an ein Tableview binde.
  • Original von Tom9811
    Die Controller von Cocoa kommen auch mit Immutables zurecht, machen es also offenbar genauso.


    d.h. sie ändern bei Bedarf auch die Werte ab?

    sind die Klassenvariablen nicht protected (also nur für die eigene Klasse und Childs zugänglich)? Wie können dann Dritte daran Änderungen vornehmen? (oder ist das bezogen auf das ungewollte Ändern innerhalb einer Klasseneigenen Funktion?)
  • d.h. sie ändern bei Bedarf auch die Werte ab?

    Was meinst du mit Werten? Die Anzahl der gespeichrten Werte oder einen bereits gespeicherten Wert an sich?

    Letztlich gleichgültig. Sie machen es über Accessoren. Der "Trick" nur Immutables zu verwenden führt ja gerade dazu, dass die Verweundung von Accessoren _erzwungen_ wird.

    sind die Klassenvariablen nicht protected (also nur für die eigene Klasse und Childs zugänglich)?

    In der Regel ja.

    Wie können dann Dritte daran Änderungen vornehmen? (oder ist das bezogen auf das ungewollte Ändern innerhalb einer Klasseneigenen Funktion?)

    Mittels Accessoren. Nein es ist bezogen auf Drittklassen. Nehmen wir mal an, du nimmst wirklich ein Mutable-Dictionary, also als Member und bei den Accessoren. Oben in meinem Code bitte entsprchend geändert vorstellen. Dann könntest du als Dritter (aka Nutzer von Instanzen der Klasse) Folgendes machen:

    Quellcode

    1. MyClass* usedClass;
    2. usedObject = ...; // Du holst dir den Verweis irgendwo ab.
    3. [[usedObject myDict] addObject:... forKey:...];


    usedObject würde nicht mitbekommen, dass gerade die Membervariable verändert worden ist! usedObject hätte auch keine Möglichkeit dies zu observieren. Es dauert nicht lange, bis das in einer Katastrophe (aka unerwartetes Beenden) endet.

    Wenn ein Dritter einen Eintrag in dem Dictionary ändern will, muss er das genau so machen, wie oben beschrieben. Innerhalb der Klasse kann man das möglicherwiese noch anders handhaben. Der Code aus dem Vorposting ist da defensiv. (Ich hatte einfach keine Lust, jetzt zwei Klassen zu schreiben.)

    Also, mal als generelle Regeln:
    1. Zugriff _nur_ über Accessoren, innerhalb wie außerhalb der Klasse.
    2. Typen der Accessoren für Collections und Strings sind _unveränderlich_, innerhalb wie außerhalb der Klasse.
    3. Daraus folgt, dass jede Änderung der Collection einen Setter-Aufruf nach sich zieht, was die benutzte Klasse stets bemerken kann, wenn sie will.

    Innerhalb der Klasse kannst du dir es auch anders machen, weil das dann ja kein Verstoß gegen den Grundsatz der Kaspelung ist. Du befindest dich ja innerhalb der Kapsel. Schön ist es aber dennoch nicht, wenn du den Member häufig selbst benutzt. Dann machst man auch gerne innerhalb der Klasse Fehler.
    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"?
  • nein, ich nutze Mutables, mein problem ist eher,

    Das _ist_ dein Problem!

    das ich nicht weiß wie ich ein array das in einer Klasse liegt an ein Arraycontroller und an ein Tableview binde.

    Hast du eigentlich meinen Artikel zu Cocoa Bindings durchgearbeitet? Der verweist als "Vorwissen" auf meine KVC- und KVO-Artikel. Wenn du die drei hinter dir hast, wirst du keine Probleme mehr haben -- hoffe ich. ;)
    macentwicklerwelt.net/index.php?title=Cocoa_Bindings
    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"?
  • zwischenruf:
    Fehler in der Datenbank
    Für die Suchanfrage "kvo"
    Es gab einen Syntaxfehler in der Datenbankabfrage. Die letzte Datenbankabfrage lautete:
    (SQL query hidden)
    aus der Funktion "". MySQL meldete den Fehler "1016: Can't open file: 'searchindex.MYI'. (errno: 145) (localhost)".

    das wiki will irgendwie nicht bei mir, gerade was schief, oder liegt's an mir?

    Hast du eigentlich meinen Artikel zu Cocoa Bindings durchgearbeitet? Der verweist als "Vorwissen" auf meine KVC- und KVO-Artikel. Wenn du die drei hinter dir hast, wirst du keine Probleme mehr haben -- hoffe ich. ;)

    Bindings, ja, allerdings nicht die beiden anderen und dazu ohne Rechner in Druckversion im Urlaub, werde mich gleich mal an die beiden machen. (btw, im bindingsartikel wurde jedoch mit mutable arrays gearbeitet - der Einfachheit halber?)
  • Bindings, ja, allerdings nicht die beiden anderen und dazu ohne Rechner in Druckversion im Urlaub, werde mich gleich mal an die beiden machen.

    *Räusper* -- schrieb ich nicht, dass man die vorher durchgelesen haben sollte? ;)

    (btw, im bindingsartikel wurde jedoch mit mutable arrays gearbeitet - der Einfachheit halber?)

    Ah, weiß ich gar nicht mehr. Der Code und Artikel ist teilweise schon recht alt. Wäre nett, wenn du etwas in die Diskussion schreibst, dann kümmere ich mich bezeiten mal darum. Danke!

    BTW: Es liegt nicht an dir. Manchmal spinnt der Suchindex. Du kannst bei Kay nachfragen, der macht das dankenswerterweise.
    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"?
  • *Räusper* -- schrieb ich nicht, dass man die vorher durchgelesen haben sollte? ;)


    *hüstel* hätt ich ja, aber bei runden 1500 Druckseiten in 2 Wochen kann man mal was vergessen in den Urlaub mitzunehmen ^^
  • hoffe ich. ;)

    ich zerstöre ungern Hoffnungen ... ich bin immer noch zu dumm zum zum :(

    Ich habe also meine Klasse "Charakter". Diese speichere ich in einem NSArray über einen NSArrayController für den ich den Controller "CharCont" angelegt habe, in diesem auch das Array ("charList") gesetzt wird. Das Ein- und auslesen von NSStrings in "Charakter" (alle über eigene Accessoren) funktioniert wunderbar, hier die erste Frage:
    Wie muß Setter/Getter/init/dealloc für ein int aussehen? (sofern überhaupt nötig ...)

    Wenn ich nun in dem NSTableView (gefüttert mit der charList) einen anderen Charakter auswähle, ändern sich alle eingegebenen Strings in den jeweiligen Feldern, ist ja auch gewollt.
    Ich habe nun "Charakter" um ein NSArray ergänst und im IB dafür einen eigenen NSArrayController angelegt, als Content binde ich "Charakter" an. Anlegen von neuen Objekten in das Array funktioniert ebenfalls.
    Was nicht funktioniert, ist das die Daten in diesem Array beim auswählen eines anderen Charakters geändert werden, sie bleiben immer gleich.

    Was hab' ich nun schon wieder falsch gemacht? ?(
  • ich zerstöre ungern Hoffnungen

    Ich weine jetzt bitterlich ...

    Wie muß Setter/Getter/init/dealloc für ein int aussehen? (sofern überhaupt nötig ...)

    Int ist kein Objekt, sondern ein Skalar. Von welcher Programmiersprache kommst du? Java?

    Wenn du es OO haben willst, verwende -numberWithInt:(NSNumber). Ansonsten müssen im Prinzip die Methoden für alle Objekte gleich aussehen.

    Wenn ich nun in dem NSTableView (gefüttert mit der charList) einen anderen Charakter auswähle, ändern sich alle eingegebenen Strings in den jeweiligen Feldern, ist ja auch gewollt.
    Ich habe nun "Charakter" um ein NSArray ergänst und im IB dafür einen eigenen NSArrayController angelegt, als Content binde ich "Charakter" an. Anlegen von neuen Objekten in das Array funktioniert ebenfalls.
    Was nicht funktioniert, ist das die Daten in diesem Array beim auswählen eines anderen Charakters geändert werden, sie bleiben immer gleich.

    Ich weiß nicht, ob ich dich richtig verstehe!? Aber der Controller des "Subarray" muss seine Bindung über den _Controller_ des Superarrays erhalten. Woher soll denn sonst der Subcontroller wissen, was im Supercontroller gerade selektiert ist?
    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 weine jetzt bitterlich ...

    tut mir leid!!

    Int ist kein Objekt, sondern ein Skalar. Von welcher Programmiersprache kommst du? Java?

    *hüst* basic, pascal und dbase ... wehe jetzt lacht einer! ist aber auch schon ewig her, also eher kann man sagen ich steige gerade ohne Vorwissen bei ObjC ein.

    Ich weiß nicht, ob ich dich richtig verstehe!? Aber der Controller des "Subarray" muss seine Bindung über den _Controller_ des Superarrays erhalten. Woher soll denn sonst der Subcontroller wissen, was im Supercontroller gerade selektiert ist?

    leuchtet mir ein, ich hab auch schon alles mir mögliche mit hinundherbinden versucht, obiges war aber bisher das beste Ergebnis ...
    Blöd gefragt: wie?
  • tut mir leid!!

    Schon gut *Snief*

    *hüst* basic, pascal und dbase ... wehe jetzt lacht einer! ist aber auch schon ewig her, also eher kann man sagen ich steige gerade ohne Vorwissen bei ObjC ein.

    Da gehörst du eigentlich nicht zur Zielgruppe des Artikels.

    leuchtet mir ein, ich hab auch schon alles mir mögliche mit hinundherbinden versucht, obiges war aber bisher das beste Ergebnis ...
    Blöd gefragt: wie?

    Indem du den Controller des Subarrays an den Controller des Superarrays bindest. (Nicht das Outlet verwenden!)

    Ich habe hier keinen Mac vor mir, so dass ich dir nicht die genauen Bezeichnungen sagen kann.

    Aber du kommst selber drauf:
    Die Member eines in selektierten Objektes bekommst du mit:
    Bind to: YourSuperArrayController
    Controller Key: selectedObject
    Model Key: wasWeissIch

    Wie kommst du jetzt an ein Member-Array? Richtig:
    Bind to: YourSuperArrayController
    Controller Key: selectedObject
    Model Key: memberArray

    Das ist jetzt ja ein Arrays, also eine taugliche Bindung für den Subarray-Controller. Von dort aus kommst du dann wieder an die Member des Subarrays usw. usf.
    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 werd bekloppt ... et jeht ...

    ich hätte wetten können das dich das schon mal hatte ... zum Glück wette ich nicht

    danke

    Da gehörst du eigentlich nicht zur Zielgruppe des Artikels

    tut mir leid!!!
  • ich werd bekloppt ... et jeht ...

    Ich weiß. :) Kölsche?

    ich hätte wetten können das dich das schon mal hatte ... zum Glück wette ich nicht

    Schade eigentlich ...

    tut mir leid!!!

    Nicht deshalb. Du hast dich ja durchgebissen.

    Außerdem wird mein Artikel für Noobs auch recht früh Bindings enthalten. Eigentlich sind sie sogar einfacher als Controller selbst programmieren.


    (Hehehehehe, zuerst stand da Boobs anstelle von Noobs ... )
    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"?
  • Kölsche?

    Berliner Boob

    Schade eigentlich ...

    ich weiß schon warum :D

    Außerdem wird mein Artikel für Noobs auch recht früh Bindings enthalten.

    Ich hoffe der ist fertig bevor ich es auch so kann ;)

    Eigentlich sind sie sogar einfacher als Controller selbst programmieren.

    ... bisher nicht - mag an meiner generellen Lernimmunität liegen was ObjC betrifft ... oder OO an sich

    kann vielleicht jemand den Titel des Threads ändern? In "Breitis blöde-Fragen-Ecke" oder so?
  • Wenn du eine blöde Frage beantwortet haben willst, solltest du dich noch einmal melden, wenn du deine App fertig hast: "Wie kann ich die auf anderen Rechnern zum Starten bringen?"

    Wahlweise erhältst du dann Forumskeile oder musst 5 € in das Deployment-Schweinchen werfen.

    Tom "Kassenwart" 9811
    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"?
  • blöde frage mal wieder nebenbei ...

    ich habe jetzt in meiner Klasse "Charakter.m" 1280 Zeilen allein nur an Settern/Gettern init und dealloc für die ganzen Variablen, ist das normal, geht das nicht offiziell und richtig mit etwas weniger Aufwand, ohne mit Dictionarys zu arbeiten?
  • Das ist viel. Wie viele Schlüssel hast du?

    Es gibt zwei Möglichkeiten:
    - Kategorien, wobei ich die Accessoren in der "Basiskategorie" lassen würde.
    - CoreData -- aber dazu habe ich noch keinen Artikel geschrieben. :)
    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"?