• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

allocWithZone:

Poljpocket

Salvatico di Campascio
Registriert
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.
 
Zuletzt bearbeitet:

Der Paule

Königsapfel
Registriert
26.05.07
Beiträge
1.199
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?
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
P.S.: Muss im zweiten Code nicht die Klasse C vorhanden sein?

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.
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
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];
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:

When one object creates another, it’s sometimes a good idea to make sure they’re both allocated from the same region of memory.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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.
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.

A muss dafür folgendes tun:
Code:
B *instanzVonB = [[B alloc]init];
Soweit ist mir alles klar.
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.

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.
Siehe oben

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?
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.
 
Zuletzt bearbeitet:

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Cocoa benutzt Reference Counting. Es gibt keinen Eigentümer, der für das -release verantwortlich ist.
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:

You own any object you create. You "create" an object using a method whose name begins with “alloc” or “new” or contains “copy” (for example, alloc, newObject, or mutableCopy). If you own an object, you are responsible for relinquishing ownership when you have finished with it.

One way to relinquish ownership of an object is to send it a release message. In Cocoa terminology, relinquishing ownership of an object is typically referred to as "releasing" an object.

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
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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.
 
Zuletzt bearbeitet:

Poljpocket

Salvatico di Campascio
Registriert
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!
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Also nochmal um sicherzugehen, mit der Methode allocWithZone: ändert der Eigentümer der Beziehung nicht!
Das hast Du richtig erkannt.

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

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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 …
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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 …
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
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
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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.
*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!!!!!!!!!!!!!!!
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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.
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
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
 
Zuletzt bearbeitet: