1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

allocWithZone:

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Poljpocket, 12.08.07.

  1. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Hallo alle Profis,

    Ich habe mal wieder eine Frage. Und zwar geht es um die Methode allocWithZone:, wessen Beschrieb in der X-Code Dokumentation ich wahrscheinlich nicht ganz verstanden habe.

    Situation:
    Es existieren 3 Klassen, Klasse A, B und C.

    Erste Variante:
    Eine Instanz von Klasse A erstellt eine Instanz von Klasse B und möchte deren Eigentümer sein, anders gesagt, verantwortlich sein, damit der Instanz auch wieder einen release: oder autorelease: Befehl zu geben. A muss dafür folgendes tun:
    Code:
    B *instanzVonB = [[B alloc]init];
    Soweit ist mir alles klar.

    Zweite Variante:
    Eine Instanz von Klasse C erstellt eine Instanz von Klasse B und möchte die ebenfalls existierende Instanz der Klasse A zum Eigentümer machen.

    Jetzt meine Frage:
    Wird die Instanz von Klasse A der Eigentümer, wenn die Instanz von Klasse C folgendes tut?
    Code:
    B *instanzVonB = [[B allocWithZone:[instanzVonA zone]] init];
    Oder noch anders gefragt, ist es überhaupt möglich sowas zu tun?

    Danke für eure Antworten

    Poljp.
     
    #1 Poljpocket, 12.08.07
    Zuletzt bearbeitet: 12.08.07
  2. Der Paule

    Der Paule Königsapfel

    Dabei seit:
    26.05.07
    Beiträge:
    1.200
    Sagt dir der Begriff Klassenvererbung/Objektorientierung etwas? Ich kenne mich mit X-Code nicht aus. Aber diese Themen solltest du mal in de Dokumentation nachschlagen, bzw. mal im Internet danach schauen.
    So wie ich dich Verstanden habe, geht es genau darum!

    P.S.: Muss im zweiten Code nicht die Klasse C vorhanden sein?
     
  3. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Nein Muss sie nicht, der Code steht in einer Ausführung in der Implementation der Klasse C. Die Vererbung und alles solche habe ich an Objective-C jetzt hoffentlich im Griff. Die Dokumentation hat mich lediglich verwirrt.
     
  4. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    Nein. Die erstellte B-Instanz liegt dann nur woanders im Speicher, was u.U. guenstige Auswirkungen auf Speicherzugriffszeiten haben kann, um's mal volkstuemlich auszudruecken.

    So versteh' ich auch diesen Satz in der Dokumentation:

     
  5. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Cocoa benutzt Reference Counting. Es gibt keinen Eigentümer, der für das -release verantwortlich ist. -release gibt eine Beziehung auf, nicht ein Objekt.
    Hier gibt es einen Einführungsartikel von mir:
    http://www.macentwicklerwelt.net/doku.php?id=wiki:speicherverwaltung
    Oder auch
    Rodewig/Negm-Awad, Objective-C und Cocoa, S. 132 ff.

    Hier vertiefst du den Fehler. Der Code, ist fehleranfällig. Du erzeugst nur einen Verweis in einer lokalen Variable. Diese stirbt demnächst. Daher ist ein -autorelease hinzuzufügen, um das Memory Leak zu vermeiden.

    Siehe oben

    Ja, aber nicht sinnvoll. Du erzeugst deine Instanzen in der Standardzone.
    Mit der "Eigentümerstellung" hat es zudem nichts zu tun, da es in Cocoa keine Eigentümer gibt.

    BTW:
    -release und -autorelease sind keine "Befehle", sondern Nachrichten, nämlich an ein Instanzobjekt. Sie nehmen keine Parameter und haben daher am Ende ihres Nammens keinen Doppelpunkt.
     
    #5 Amin Negm-Awad, 13.08.07
    Zuletzt bearbeitet: 13.08.07
  6. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    Man koennte es auch so sagen: Im von Dir genannten Sinne ist jeder Eigentuemer, d.h. fuer mindestens ein "release" verantwortlich, der ex- oder implizit "retain" gesagt hat. Und das sind im Wesentlichen die, die ...

    • alloc
    • new[Object]
    • [mutable]copy[withZone:] (fehlt m.E. in Deinem Wiki-Artikel, aber zugegebenermassen nur Klassen betreffend, die NSCopying unterstuetzen)
    • retain
    ... gesagt haben. So drueckt es Apple auch gerne mal aus, z.B. hier:

    Vor allem das "retain" find' ich ein schoenes Konzept. Ich geh' jetzt mal in die Stadt, stell' mich neben die oertliche Niederlassung der Deutschen Bank und rufe laut "retain!". Mal gucken, ob's was nuetzt. :D
     
  7. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Jein, man ist dann Eigentümer der Beziehung, nicht der Instanz. (Eigentümer eines Klassenobjektes ist ohnehin nur die RTE.)

    Die Ausführungen von Apple zur Speicherverwaltung möchte ich nicht weiter kommentieren. Es ist kein Zufall, dass Apple-Applikationen zahlreiche Memory Leaks haben – ebenso wie Fachbücher von Cocoa-Urgesteinen.
    +++
    Zum Copy: Ich habe dem auch im Buch ein eigenes "Unterkapitel" gewidmet. Beim Copy gibt es ja zahlreiche Probleme, nicht nur das Reference Counting.
     
    #7 Amin Negm-Awad, 13.08.07
    Zuletzt bearbeitet: 13.08.07
  8. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    OK! Dann meine ich mit allen "Eigentümern" die Eigentümer der BEZIEHUNG! Ich wollte einfach die Methode allocWithZone: richtig verstehen, und wie ihr gemerkt habt, habe ich es eben bis jetzt nicht getan! :) Das Reference-Counting ist mir überaus klar, wie das funktioniert, auch was es mit retain und release auf sich hat! (Die Doppelpunkte sollten da nicht stehen, da hast du Recht!)

    Eine Instanz hat einen Retain-Count, und der wird mit allen retains, die andere Instanzen dieser Instanz senden um 1 erhöht und mit jeder release Nachricht um 1 verkleinert, sobald der Retain-Count auf 0 gelangt, wird die Instanz ja von anderen Instanzen nicht mehr verwendet und von der Runtime automatisch "zerstört".

    Also nochmal um sicherzugehen, mit der Methode allocWithZone: ändert der Eigentümer der Beziehung nicht!
     
  9. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    Das hast Du richtig erkannt.

    Und entschuldige die unnoetige Speichermanagementdiskussion. Man ist halt stolz drauf, wenn man's mal verstanden hat. :D
     
  10. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Mir gehts genauso :p
     
  11. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Ich wollte das nur – ich habe da gewisse Erfahrungswerte ;) – noch einmal klarstellen. Bedenke, dass Instanz und Beziehung ja ganz unterschiedliche Entitäten sind, insbesondere, eine Instanz beliebig viele Beziehungen haben kann.

    Ansonsten in Bezug auf die Zones: Auch von mir ein Ack. Es hat nichts miteinander zu tun. Zones sind Speicherbereiche, die der Kernel (Genauer: Die Speicherverwaltungs-Kext) verwalten kann. IIRC (und mit aller Vorsicht) werden die aber ohnehin nicht mehr unterstützt.
     
  12. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Erzähl mir mehr :D

    Alex
     
  13. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Dir muss ich das sicher nicht erläutern.

    BTW: Hast du mal spaßeshalber eine User-Space Speicherverwaltung geschrieben? Okay, ist gibt noch andere Späße …
     
  14. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Alex, ich habe es im Nachgang unserer Gespräches noch einmal nachgeschaut. In der Tat bleibt Singh dort erstaunlich ungewiss.

    Zunächst meint er mit "external" nur das, was außerhalb des Kernel-Spaces verbleibt, also im US. Dann erläutert er, dass "der Kernel" beim "Pager" anfragt, was ja dem entspricht, was ich heute über Skype geschrieben hatte.

    Letztlich nennt er aber auch nicht, wllt habe ich es nur übersehen, die konkreten Kext der drei "mitgelieferten" Pager.

    Alles sehr dubios …
     
  15. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Das ist jetzt Offtopic, aber das meinte ich ja schon: Singh ist sehr akademisch, wenn es darum geht wie das VM jetzt praktisch zusammenhängt ist man wieder auf sich angewiesen.

    Aber vielleicht hab ich da auf den 200 Seiten etwas übersehen.

    Alex
     
  16. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    *g*

    Ales, das ist auch nicht einfach. Man ist ständig im Widerstreit zwischen "Mache ich es ganz genau" (aka akkademmisch ausklamüsert) und "Was kann er damit anfangen" (aka praktisch anwendbar).

    ES IST EIN STÄNDIGER INNERER WIDERSTREIT!!!!!!!!!!!!!!!
     
  17. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.245
    Hallo
    Memory Zones sind nicht ohne Grund auf Pagesizes ausgerichtet. Mit den UNIX System Calls: mlock, posix_madvise & Co. kann man den Kernel anweisen das Paging für die eigenen Zwecke anzupassen, die man-Pages enthalten einen kurzer Hinweis wie es geht. Das vergleiche man bitte mit der SUS. Meistens reicht es aus nur einige Speicherbereiche mit den obigen Befehlen abzuändern, was wiederum sinnvoll erscheinen läßt ein Konzept wie Memory Zones in Cocoa zu haben. Ohne Zones wäre der Arbeitsaufwand deutlich größer.
     
  18. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Danke, aber mein Interesse ist dann doch mehr "Off Topic", denn ich interessiere mich vor allem für eine Frage: Könnte ich auf OS X ein Funktion schreiben, die eine beliebige virtuelle (Kernel) Adresse in "PCI Space" mapt (Auf Linux macht das pci_map_single). Auf OS X habe ich offenbar nur den offiziellen Weg über IOMemoryDescriptor und IODMACommand, aber das führt dann de facto dazu, dass man sich quasi sein eigenes private Virtual Memory Management schreiben muss.

    Das Problem tritt dann auf, wenn man platformunabhängigen Code hat, der mit solchen Callbacks (virtuelle Adresse rein, DMA Adresse raus) arbeitet.

    Alex
     
    #18 below, 14.08.07
    Zuletzt bearbeitet: 14.08.07

Diese Seite empfehlen