6 berichten aan het bekijken - 1 tot 6 (van in totaal 6)
  • Q:
    Bijdrager
    bare_nature

    Vraag in verband met Cocoa

    Hallo,

    Eén van de methods van NSTextField is:
    – (NSString *)stringValue

    Waar staat die asterisk voor? De opbouw van een method is normaal gezien:
    – (type)method

    Ik ben me sinds kort objective C aan het aanleren vandaar deze vraag.

    Alvast bedankt,

    BN

    Bijdrager
    henno

    Het type is pointer (*) naar NSString. Dus het adres van een NSString.
    (Blijkbaar ken je geen C of C++: deze hebben dezelde notie).
    Voor een goed boek over Objective C (dat basaal begint):
    Kochran: Programming in Objective C.

    Henno

    Bijdrager
    bare_nature

    Enkele maanden geleden heb ik een snelcursus C gevolgd maar de notatie kwam me vreemd voor. Wat is het verschil dan tussen volgende notaties:

    (NSString *)stringValue;
    (NSString)stringValue;
    NSString *stringValue;

    Of is de tweede simpelweg foutief?

    Het boek van Kochran had ik overigens al besteld maar het is nog niet toegkomen ;-).

    Merci voor de hulp,

    BN

    Bijdrager
    henno

    NSString *)stringValue;

    is de goede notatie: de method (functie) geeft een (pointer) naar een object NSString terug.

    (NSString)stringValue;

    Dit zou een method zijn die rechtstreeks een NSString teruggeeft, en geen pointer naar
    een NSString. Een pointer is het adres (dus maar een “woord” (32 of 64 bits afhankelijk
    van de processor)) naar waar het object staat en in Objective C wordt met objecten
    als argumenten en returnvalues uitlsuitend met pointers gewerkt.
    (dit is met klasse-objecten in C# ook zo, als ik me goed herinner).
    Dit is ook efficienter: een adres is maar kort en een klasse kan zeer groot zijn; in C is het mogelijk
    een zogenaamde struct als waarde terug te geven, maar veel normaler is het met pointers
    ernaar te werken. Bij Kochan heb ik niet een expliciete verwijzing nog kunnen vinden
    die dit hard maakt maar volgens mij is het dus zo: met een klasse kan alleen met pointers ernaar
    gewerkt worden in functies.

    NSString *stringValue;

    Is dit niet een pointer naar een functie die een NSString zou teruggeven?
    En dit kan dus niet. Zeker als er – of + voorstaat: dan moet het een method zijn en
    geen pointer naar een method….

    Dus alleen (i) is juist, en zo werkt ObjC nou een keer.

    Bijdrager
    henno

    -(NSString *)stringValue;

    is de goede notatie: de method (functie) geeft een (pointer) naar een object NSString terug.

    (NSString)stringValue;

    Dit zou een method zijn die rechtstreeks een NSString teruggeeft, en geen pointer naar
    een NSString. Een pointer is het adres (dus maar een “woord” (32 of 64 bits afhankelijk
    van de processor)) naar waar het object staat en in Objective C wordt met objecten
    als argumenten en returnvalues uitlsuitend met pointers gewerkt.
    (dit is met klasse-objecten in C# ook zo, als ik me goed herinner).
    Dit staat in Kochan’s boek in het hoofdstuk over “underlying language features”,
    aan het einde: een object is altijd een pointer naar een struct (intern).
    Dit is ook efficienter: een adres is maar kort en een klasse kan zeer groot zijn; in C is het mogelijk
    een zogenaamde struct als waarde terug te geven, maar veel normaler is het met pointers
    ernaar te werken.

    NSString *stringValue;

    Dit is een declaratie van een object van type NSString, een variabele met de naam stringValue.
    Dit kan dus geen “method” zijn (als er een + of – voorstaat).

    Dus alleen (i) is juist, en zo werkt ObjC nou een keer.

    Bijdrager
    bare_nature

    Het boek van Kochan is gearriveerd en ik ben het nu aan het doornemen. Allezins bedankt voor de hulp.

    BN

6 berichten aan het bekijken - 1 tot 6 (van in totaal 6)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.