Slik å lagre en verdi av NSString som røye array innenfor en struktur i Objective-C?

stemmer
2

Jeg har problemer med å tilordne verdien av en NSStringtil en char *innenfor en struktur av en singleton klasse. Følgende er en forenkling av problemet mitt. Min kode benytter flere felt i strukturen og passerer flere NSStrings.

Si jeg har en singleton klasse SingletonClass med en (jeg har gjort mitt lekser med Apple Dokumentasjon og implementert det riktig) struktur:

struct sampleStruct {
    char *string1;
    //other fields
} struct1;

med denne metode som setter verdien struct1.string1til den NSString som var passert:

- (void)initStructWithString:(NSString *)inputString {
     //warning: assignment discards qualifiers from pointer target type
     struct1.string1 = [inputString cStringUsingEncoding:NSUTF8StringEncoding];
}

og denne fremgangsmåte som benytter struct1.string1:

- (void)useCharArray {
     //I would obviously be doing something more complex in reality
     printf(This is the char array: %s, struct1.string1);
     //doesn't print the value I assigned to it, but garbage
}

Når jeg ringer initStructWithString:(NSString *)inputStringfra en klasse og prøver å ringe useCharArrayfra en annen klasse struct1.string1er en haug med søppel. Under debugging Jeg har bekreftet at hver klasse får samme forekomst av dette SingletonClass.

Jeg er fortsatt å lære Objective-C, samt C underveis, så jeg er klar over det kan være et problem med min minnehåndtering. Jeg vet jeg [NSString cStringUsingEncoding]skal tildeles en const char *og ikke en char *, men jeg vet ikke hvordan andre å gå om det siden feltet i strukturen er en char *. Jeg har prøvd andre metoder innenfor initSructWithStringfor eksempel tildele en ny const char *resultatet av [NSString cStringUsingEncoding]og deretter kopiere det med strlcpytil struct1.string1. At tilnærmingen hadde samme resultat.

Hva er riktig teknikk for lagring av verdien av en NSStringi en char *i en struct og hvordan kan jeg sikre at feltene i denne struct beholde sin verdi som SingletonClassbrukes av forskjellige klasser?

Publisert på 14/07/2009 klokken 16:15
kilden bruker
På andre språk...                            


3 svar

stemmer
4

En ting verdt å merke seg er at den riktige metoden navnet skulle være cStringUsingEncoding:; og at denne strengen forsvinner omtrent samtidig inputStringgjør, så den resulterende strengen blir nødt til å bli kopiert.

Det kan også være verdt å utforske bruken av UTF8Stringstedet (en praktisk metode som gjør det samme).

Svarte 14/07/2009 kl. 16:22
kilden bruker

stemmer
1

Kan ikke kommentere ennå, så skriver her (etter upping ovenfor Svar) ... Bare kom over dette (jeg skjønner det er noen år senere) og funnet et eksempel kan hjelpe andre til en viss grad:

Jeg bruker dette for å få spillerens navn fra Game Center på iOS, vil jeg ha problemer med funky tegn osv, men min skrift ikke støtte dem uansett. ppName er åpenbart en peker til en peker til en forkulling, føres til den metode som jeg har denne koden i.

*ppName = (char *)malloc(strlen([pPlayer.alias UTF8String]));
strcpy(*ppName, [pPlayer.alias UTF8String]);
Svarte 03/04/2011 kl. 07:09
kilden bruker

stemmer
0

Hvis du trenger å lagre NSString i en struct, og deretter fra at struct få en NSString tilbake (for eksempel hvis du trengte å sende en streng til en annen spiller i en Game Center multiplayer spill), kan du gjøre det slik:

typedef struct {
   char stringToSend[20];
   int stringToSendLength;
} myStruct;

// create a Struct and an NSString
myStruct aStruct;
NSString *stringToConvert = @"stringToConvert";

// convert NSString into char array
for (int i = 0; i < stringToConvert.length; i++) {
    aStruct.stringToSend[i] = [stringToConvert characterAtIndex:i];
}

aStruct.stringToSendLength = stringToConvert.length; // send string length

// store struct into NSData object
NSData *data = [NSData dataWithBytes:&aStruct length:sizeof(myStruct)];

// retrieve data
myStruct *anotherStruct = (myStruct *)[data bytes];

// convert char array into NSString and only keep part required (without some weird random characters)
NSString *receivedString = [[NSString alloc] initWithBytes:anotherStruct->stringToSend length:anotherStruct->stringToSendLength encoding:NSASCIIStringEncoding];
Svarte 19/10/2013 kl. 14:51
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more