Objc Runtime Datenstruktur "objc_class" - das "cache" Element

  • ist halt eine Frage des Blickwinkels...Die Struktur ist die gleiche, aber kann semantisch eine andere Bedeutung haben...naja ich werde jetzt mal meine Ausarbeitung korrigieren müssen, nach all diesen neuen Erkenntnissen - verdammt! Und danach stelle ich keine Fragen mehr, sonst muss ich noch mehr ändern....es ist Feature- UND Bug-freeze ;-)!
  • Mein Hinweis: Nimm die "pocket-reference" nicht zu ernst. Sie ist zu wenig pocket, zum Nachschlagen zu viel und vor allem theorielastig, und dann nicht mal richtig.
    Objective-C ist pragmatisch, lebt mit Inkonsistenzen wie globals (NSApp) und Typen, die keine Objekte sind (NSRect, NSRange, NSPoint), aber es lebt ganz gut.
    super: Will Shipley hatte da mal was geschrieben, ich schau noch mal.

    Edit: links
    Factory Methods:
    Will Shipley's blog
    und die Diskussion dazu:
    cocoadev
    I would be embarrassed if they did not spy on me.
  • Ja, aber sowohl Instanzmethoden als auch Klassenmethoden lassen sich in der Klasse optimal implementieren.

    Klassenmethoden deshalb, weil sie zur Klasse gehören.

    Instanzmethoden würden eigentlich zur Instanz gehören. Dennoch lassen sie sich in der Klasse implementieren, da Instanzen gleicher Klassen den gleichen Methodensatz haben.

    Mithin ist das in der Hierarchie dieselbe Ebene. Es gibt keinen Grund dafür, sie unterschiedlich zu behandeln, mit der Ausnahme, dass man sie zur Laufzeit unterscheiden können muss.

    Die Beziehung Klasse-Metaklasse wird daher keinen neuen Bedeutungsgewinn haben, sondern eine simple 1:1-Beziehung sein. Mutmaßlich hat das einfach Praktikabilitätgründe.
    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"?
  • Etwas anderes als irgendwas Praktisches in der Implementierung kann es eigentlich nicht sein. Einen informationstheoretischen Grund wie etwa Bündelung verschiedener Klassen, kann ich beim besten Willen nicht erkennen.
    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"?
  • Ah, ich ahne den Grund für die unterschiedliche Behandlung: Das Instantierungsverhalten.

    Die Klassenstruktur muss spätestens vorhanden sein, wenn eine Klassenmethode aufgerufen wird, mutmaßlich schon früher. Zu diesem Zeitpunkt muss es aber noch keine Instanzstruktur geben. Wer weiß schon, wann es dann die erste Instanz gibt.

    Es kann daher unter Sparsamkeitsgesichtspunkten gut sein, die Strukturen getrennt aufzubauen.
    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"?
  • Dein Hinweis auf die 'tags' bringt Licht in die Terminologie:
    • The CLS_CLASS (0x1L) flag indicates that this definition represents a class, which contains instance methods and variable definitions that are allocated for each new instance of the class.
    • The CLS_META (0x2L) flag indicates that this class definition represents a metaclass, which contains the list of methods that are not specific to any one instance of the class (class methods).

    Klassenmethoden sind unspezifisch, Objekt- oder Instanzmethoden sind spezifisch, gute Umschreibung eigentlich.
    Zur Funktion 'objc_addClass ' auf der Referenzseite wird beispielhaft eine Klassenstruktur geladen, ohne dass Methoden geladen sind: der Speicher für die Liste wird eingerichtet, aber der Wert auf -1 gesetzt. Erst wenn die Klasse verwendet wird, werden Methoden benötigt.
    Das Beispiel ist auf jeden Fall aufschlussreich.
    I would be embarrassed if they did not spy on me.
  • Was bedeutet 'optimal',

    Na, dioe logische Implementierung wäre in der Instanz. Dann würde aber jede Instanz die Information mitschleppen, die für alle Instanzen gleichh ist. Das wäre deutlich suboptimal.
    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"?
  • Was ich meinte, optimal hin oder her, es gibt keine Wahl. Im Vergleich zu anderen Programmiersprachen mag Objective-C in dem Sinne 'optimal' sein, ich wage das nicht zu behaupten, aber innerhalb davon gibt es nur diese eine Vorgehensweise.
    I would be embarrassed if they did not spy on me.
  • Ich sprach auch nicht davon, dass Objective-C optimal sei. Optimal für welche Aufgabe?

    Ich sprach davon, dass die Implementierung der Instanzmethodenliste innerhalb der Klasse optimal sei in Objective-C.
    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 Tom9811
    Ich sprach auch nicht davon, dass Objective-C optimal sei. Optimal für welche Aufgabe?

    Davon sprach ich auch nicht, ich sprach von Objective-C in dem Sinne (des Implementieren von Methoden), nicht allgemein.

    Wenn ich diese Formulierung:
    Original von Tom9811
    Ja, aber sowohl Instanzmethoden als auch Klassenmethoden lassen sich in der Klasse optimal implementieren.

    so verstehen soll:
    Ich sprach davon, dass die Implementierung der Instanzmethodenliste innerhalb der Klasse optimal sei in Objective-C.
    , ist alles in Ordnung.
    Hatte ich dummerweise so verstanden, als wenn es noch etwas anderes gäbe, das im Sinne des Implementieren von Methoden innerhalb von Objective-C weniger optimal wäre.
    I would be embarrassed if they did not spy on me.
  • Solange es nur eine Varibale 'isa' in den Instanzen gibt, weiss ich nicht wie das gehen soll. Wenn die 'root-class' mit zur Sprache gerechnet wird, sehe ich das nicht:

    Quellcode

    1. objc_object {
    2. Class isa;
    3. } *id;
    Kennst Du Varianten von Objective-C, in denen das anders ist?
    I would be embarrassed if they did not spy on me.
  • ?????????????????????????????????????

    Du meinst, solange die Implementierung optimal ist, siehst du nicht, wie sie suboptimal aussähe?

    Übrigens ist die Struktur unvollständig. Das ist der unveränderliche Teil. In der tatsächlich allozierten Instanz hast du ganz sicher noch die Instanzvariablen. Genauso könnte man es mit der Methodenliste machen. Und das wäre suboptimal.

    Es gibt Sprachen die das machen, weil du für jede *Instanz* den Methodensatz anlegen kannst. Deshalb muss das mit der Instanz geführt werden. Das gilt etwa für sämtliche prototypen-basierte Sprachen.

    Und nein, ich kenne keine suboptimale Implementierung von Objective-C. Wieso sollte das jemand machen?
    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 Tom9811
    Und nein, ich kenne keine suboptimale Implementierung von Objective-C. Wieso sollte das jemand machen?

    Eben.
    Aber es gibt Leute, die denken darüber nach.
    I would be embarrassed if they did not spy on me.