1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Frage zu Methoden & Rückgabewert eines Objectes

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Duck Dodgers, 15.01.10.

  1. Duck Dodgers

    Duck Dodgers Reinette de Champagne

    Dabei seit:
    06.12.09
    Beiträge:
    419
    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
     
  2. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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
     
  3. Duck Dodgers

    Duck Dodgers Reinette de Champagne

    Dabei seit:
    06.12.09
    Beiträge:
    419
    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?
     
  4. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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
     
  5. Duck Dodgers

    Duck Dodgers Reinette de Champagne

    Dabei seit:
    06.12.09
    Beiträge:
    419
    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.
     
  6. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Ja, gut so :)
     
  7. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    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.
     
  8. Duck Dodgers

    Duck Dodgers Reinette de Champagne

    Dabei seit:
    06.12.09
    Beiträge:
    419
    Danke für die Info :)
     

Diese Seite empfehlen