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

    Verschil NSString – NSMutableString?

    Hallo Allemaal!

    Jaren geleden met C begonnen en mijn programmeer vaardigheden van toen maar eens voortgezet in Cocoa. Maar dat valt nog niet mee en dus maar begonnen met “Become an Xcoder”.

    Maar nu iets wat me niet duidelijk is:

    Zoals in C gebruikelijk is moet je eerst een (pointer naar een) string declareren. Zoiets:

    MSString * x;
    x = @”Julia”;

    NSLog geeft dan keurig “Julia”. Volgt er dan een regel met:

    x = @”Romeo”;

    Dan geeft NSLog “Romeo”. Uit de tekst begreep ik dat NSString ‘inmutable is’, maar ik kan kennelijk de inhoud van de string toch wel veranderen???

    Als ik trouwens compileer met “MSMutableString * x;” krijg ik juist een warning (“assignment from distinct Objective-C type”).

    Waar begrijp ik het niet goed???

    Ik schreef al dat ik vroeger in C programmeerde. Ik moet dus nog erg wennen aan het object georiƫneerd programmeren. Zit daar de fout?

    Ik gebruik trouwens Xcode.

    Alvast bedankt voor een reaktie:

    ST

    Bijdrager
    Norm 2782

    NSMutableString is een child class van NSString en heeft dus alle functionalitet van een NSString, plus wat extra.

    Ik heb het niet uitgetest, maar volgens mij kan je er zo 1 aanmaken:

    NSMutableString *x = [NSMutableString stringWithCapacity:10];

    (waar 10 een willekeurig getal is, zie beneden)

    stringWithCapacity:
    + (id)stringWithCapacity:(unsigned)capacity

    Returns an empty mutable string. The capacity argument represents characters and is used as a hint for how much initial storage to reserve.

    Vervolgens kan je met:
    [x setString:myStringObj]

    de inhoud van je NSMutableString veranderen:

    setString:
    – (void)setString:(NSString *)aString

    Replaces the characters of the receiver with those in aString. aString may not be nil.

    (in XCode bij Help -> Documentation en dan een API search doen… kan je een hoop vinden:) )

    Bijdrager
    Pandikokku

    Een mutable string is te wijzigen via Objective C, een string niet.

    Je kan ze beide echter wel wijzigen via normale C(++) methodes. Maar dit wordt AFGERADEN.

    Zo kan je op een NSMutableString bijvoorbeeld operaties uitvoeren zoals appendString (een string er aan toevoegend) maar bij een gewone NSSTring niet:

    [code:1:88ae3d17cf][mijnstring appendString:@"toevoeging"][/code:1:88ae3d17cf]

    Wanneer een string dus moet kunnen veranderen van inhoud, gebruik dan een NSMutableSTring.

    Gebruik geen C(++) operaties op strings:

    mijnstring = @”hallo” is niet toegestaan. Dat moet zijn:

    [code:1:88ae3d17cf][mijnstring setString:@"hallo"][/code:1:88ae3d17cf]

    anders gaat je applicatie op een dag toch echt crashen. Raadpleeg een boek over Cocoa / Objective bijvoorbeeld van O’Reilly. Daarin wordt ook uitgelegd waarom wel of geen C operatoren te gebruiken.

    Inactief
    Anoniem

    Strict gesproken is NSMutableString geen subclass van NSString. Beide classes behoren tot een zogenaamd class cluster, zie hier voor een uitleg.

    Verder kan ik je sterk aanraden om een goed Cocoa boek te kopen, ik had heel veel aan het boek van Hillegass.

    Bijdrager
    bitsflew
    ”ST”

    Uit de tekst begreep ik dat NSString ‘inmutable is’, maar ik kan kennelijk de inhoud van de string toch wel veranderen???

    In jouw voorbeeld veranderd niet de inhoud van een string maar de verwijzing naar een string.

    Bijdrager
    bitsflew
    ”koen”

    Strict gesproken is NSMutableString geen subclass van NSString.

    NSMutableString is wel degelijk een subclass van NSString!

    Kijk maar eens in “NSString.h”


    @interface
    NSMutableString : NSString

    Inactief
    Anoniem
    ”bitsflew”
    ”koen”

    Strict gesproken is NSMutableString geen subclass van NSString.

    NSMutableString is wel degelijk een subclass van NSString!

    Kijk maar eens in “NSString.h”


    @interface
    NSMutableString : NSString

    Verrek, altijd gedacht dat ze allebei een publieke class waren van het cluster. Maar daarnaast dus ook nog super- en subclass van elkaar.

    Bijdrager
    The – DDD
    ”bitsflew”
    ”ST”

    Uit de tekst begreep ik dat NSString ‘inmutable is’, maar ik kan kennelijk de inhoud van de string toch wel veranderen???

    In jouw voorbeeld veranderd niet de inhoud van een string maar de verwijzing naar een string.

    En het is een memory leak als ik het goed heb. De strings die je met de @ syntax aanmaakt worden net als reguliere objecten op de heap aangemaakt en niet op je call stack (of hoe dat ookweer heet wanneer aan het einde van je functie het gegeven ook weer weg is). (Lees vooral het stuk over het retainen en releasen van objecten even goed door.

    Inactief
    Anoniem

    http://www.cocoadev.com/index.pl?MemoryManagement

    Eigenlijk verplicht voer voor iedere Cocoa developer:)

    Bijdrager
    The – DDD
    ”The
    ”bitsflew”
    ”ST”

    Uit de tekst begreep ik dat NSString ‘inmutable is’, maar ik kan kennelijk de inhoud van de string toch wel veranderen???

    In jouw voorbeeld veranderd niet de inhoud van een string maar de verwijzing naar een string.

    En het is een memory leak als ik het goed heb. De strings die je met de @ syntax aanmaakt worden net als reguliere objecten op de heap aangemaakt en niet op je call stack (of hoe dat ookweer heet wanneer aan het einde van je functie het gegeven ook weer weg is). (Lees vooral het stuk over het retainen en releasen van objecten even goed door.

    Het voelde toch alsof ik onzin zat uit te kramen, heb het even nagezocht en inderdaad.

    linkje
    De @”” sintax declareert een constant NSString…

    En nu komt er een leuke…
    nog een linkje

    Een middels @”” gedeclareerde string is in objective C dus een NXConstantString…



    Nooooooooit van gehoord, maar goed het staat in de docs.

    Vraag me nu wel af of je een @”” string nu wel of niet kan aanpassen.

    Inactief
    Anoniem

    Als het een constant is, lijkt me dat niet eh;)

    Bijdrager
    bitsflew
    ”The

    Vraag me nu wel af of je een @”” string nu wel of niet kan aanpassen.

    Ik zou zeggen, probeer het volgende eens

    NSString* aString = [(NSMutableString*)@”string1″ appendString: @”string2″];

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

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