• 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

Frage zu Methoden & Rückgabewert eines Objectes

  • Ersteller Deleted member 99757
  • Erstellt am

Deleted member 99757

Gast
Hallo,

so habe mal wieder eine Obj-C Frage. Komme ja eigentlich von Pascal, Java und mache Obj-C erst die letzten Jahre intensiver, daher musste ich mich mit dem "Aufräumen" von allokierten Objekten weniger beschäftigen. Also es gibt da eine Sache, die habe ich bis jetzt noch nicht so richtig beantworten könne: wenn eine Methode ein Object, z.B. ein NSString, zurück gibt
Code:
- (NSString*) getString
{
     NSString * retString = ...;
     ...
     return retString;
}
Reicht es eigentlich den NSString direkt zurück zugeben, oder sollte das lieber über ein copy bzw. retain und autorelease gelöst werden? Oder ist das egal?
Code:
return [ [ retString copy ] autorelease ];
Habe leider keine eindeutige Aussage im Netz finden können, also wenn mir das jemand kurz erklären könnte, wäre ich sehr dankbar :)

Grüße
Rob
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Hallo,

ein NSString ist in sog. immutable. Das heisst, man kann den Inhalt (die Zeichenkette) des Strings nicht direkt verändern. Darum ist es gerade bei einem NSString nicht nötig, ein copy (was eine Kopie des Objektes zurückgibt) durchzuführen. Für die Bedeutung von copy und retain, schau dir in der Doku die Seiten zu Memory Management genauer an.

Hintergrundinfo: Viele Cocoa-Klassen haben eine Subklasse, welche NSMutable... heisst. Diese bezeichnet dann die direkt veränderbare Version derselben Klasse. Bei solchen Objekten musst du dir das dann genauer überlegen, weil andere Teile deines Programmes dann GENAU das ausgegebene Objekt bearbeiten können :). Beispiele sind: NSArray - NSMutableArray, NSDictionary - NSMutableDictionary, usw...

Gruss ppocket
 

Deleted member 99757

Gast
besten Dank für die Antwort. Die Mutable-Objekte kenne ich. An das "Problem", dass Mutable-Objekte nach Rückgabe verändert werden können, hatte ich gar nicht so gedacht. Ich war nur verwirrt, dass in den Beispielquellcodes in einem Cocoa Buch auch für nicht-mutable Objekte ein copy zurückgegeben wird! Also ist das speichertechnisch (das hatte ich eigentlich mit meiner Frage gemeint) total egal ob ich das Objekt direkt oder eine Kopie zurückgebe?
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Von deinem Standpunkt aus ja! Du musst nur bedenken, dass dann zwei Objekte mit denselben Eigenschaften existieren, also ist es aus der Sicht des Systems nicht ganz egal, denn eine Information braucht den doppelten Speicherplatz als nötig. Es würde ja reichen, wenn die Information einmal gespeichert ist. Jede Referenz zu einem Obj-C Objekt ist ein Pointer, also besitzt niemand das Objekt. Einige brauchen es nur, und darum erhöhen sie den retain-count. Das ist die Idee von Obj-C. Und aus diesem Grund mache ich das beschriebene Vorgehen NIE so bei immutable Objects. Aber jedem das Seine!

In dem Sinne, viel Erfolg noch beim weiter Programmieren und Kennenlernen, ppocket
 

Deleted member 99757

Gast
ok verstehe. Vielen Dank für die Erläuterung :-D Bis jetzt habe ich immer das Objekt direkt zurückgegeben und werde auch (soweit nicht anders nötig) dabei bleiben.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Hallo,

ein NSString ist in sog. immutable. Das heisst, man kann den Inhalt (die Zeichenkette) des Strings nicht direkt verändern. Darum ist es gerade bei einem NSString nicht nötig, ein copy (was eine Kopie des Objektes zurückgibt) durchzuführen. Für die Bedeutung von copy und retain, schau dir in der Doku die Seiten zu Memory Management genauer an.

Hintergrundinfo: Viele Cocoa-Klassen haben eine Subklasse, welche NSMutable... heisst. Diese bezeichnet dann die direkt veränderbare Version derselben Klasse. Bei solchen Objekten musst du dir das dann genauer überlegen, weil andere Teile deines Programmes dann GENAU das ausgegebene Objekt bearbeiten können :). Beispiele sind: NSArray - NSMutableArray, NSDictionary - NSMutableDictionary, usw...

Gruss ppocket
Das ist so nicht ganz richtig. Da die Mutable-Varianten Subklassen sind, kann es immer sein, dass man eine Instanz von NSMutableString hat, wo in der Source NSString steht. Es sei allerdings zugegeben, dass der Nutzer der Methode schon über erhebliche kriminelle Energie verfügen muss, daraus einen Nutzen zu ziehen. Also nur zur Vollständigkeit.
 

Deleted member 99757

Gast
Das ist so nicht ganz richtig. Da die Mutable-Varianten Subklassen sind, kann es immer sein, dass man eine Instanz von NSMutableString hat, wo in der Source NSString steht. Es sei allerdings zugegeben, dass der Nutzer der Methode schon über erhebliche kriminelle Energie verfügen muss, daraus einen Nutzen zu ziehen. Also nur zur Vollständigkeit.

Danke für die Info :)