• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

std::string nach NSString konvertieren

Nighthawk

Linsenhofener Sämling
Registriert
16.12.06
Beiträge
2.558
Die Frage steht eigentlich schon im Titel. Wie mach ich das?
 
Code:
const char *cString;
std::string cppString;

cppString = "Hallo Welt!";
cString = cppString.c_str();

NSString *objcString = [NSString stringWithCString:cString encoding:NSASCIIStringEncoding];
Das musst Du in eine Objective-C++ Datei schreiben (Dateiendung .mm).

MacApple
 
  • Like
Reaktionen: Nighthawk
Das wird nichts. std::string darf Null-Bytes enthalten! Ohne Länge des Strings kann das nicht funktionieren, die entsprechende Methode von NSString, die einen garantierte Konversion erlaubt ist aber seit MacOS X 10.4 deprecated. Insofern muß erstmal überprüft werden, ob std::string keine Null-Bytes enthält.
 
Zuletzt bearbeitet:
Naja, Cocoa ist ja nicht alles im Leben, und glücklicherweise ist NSString "toll-free bridged" mit CFString

Code:
	std::string s;
[...]
	NSString * cocoaString;
	
	cocoaString = (NSString*)CFStringCreateWithBytes(kCFAllocatorDefault, (const UInt8*)s.c_str(), s.size(), kCFStringEncodingUTF8,false);
Encoding sollte man natürlich entsprechend setzen.

Alex
 
@Alex:
Da sagst du was. Ich habe mir nie Gedanken darüber gemacht, ob ein NSString resp. CFString ein \0 enthalten darf. Aber das darf es wohl.

Allerdings wirft er dann eine Warning und NSlog() geht freilich auch nicht mehr. Aber enthalten sein darf es wohl
Code:
    NSString* with0 = @"hallo\0Welt";
    NSLog( @"%@", with0 );
    NSLog( @"%d", [with0 length] );
FileMO.m:443: warning: embedded NUL in CFString literal
2007-12-17 16:20:45.220 LawFirm #9811[22505] hallo
2007-12-17 16:20:45.220 LawFirm #9811[22505] 10
 
Danke schonmal für die Tips :)

So langsam dreh ich hier am Rad. Cocoa-Oberflächen über Objective-C++ für C++-Programme zu schreiben ist grausam...
 
CFShow() funktioniert aber noch. NSLog () habe ich nicht probiert.

Alex
 
Und in ein NSTextField per setStringValue: reinschreiben geht auch. Und es wird auch angezeigt. Und editieren geht auch.

Kann es sein, dass NSStrings (bzw. CFStrings) mit dem guten, alten Pascal-Strings "verwandt" sind, d.h. nicht Zero-terminated sind, sondern einen Counter für die Anzahl der Zeichen beinhalten?

Gruss, Jörg
 
Kann es sein, dass NSStrings (bzw. CFStrings) mit dem guten, alten Pascal-Strings "verwandt" sind, d.h. nicht Zero-terminated sind, sondern einen Counter für die Anzahl der Zeichen beinhalten?

Das würde ich so nicht sagen. CFStrings und NSStrings sind Objekte, die eben eine Länge haben, genau wie std::string

Alex
 
Und in ein NSTextField per setStringValue: reinschreiben geht auch. Und es wird auch angezeigt. Und editieren geht auch.

Kann es sein, dass NSStrings (bzw. CFStrings) mit dem guten, alten Pascal-Strings "verwandt" sind, d.h. nicht Zero-terminated sind, sondern einen Counter für die Anzahl der Zeichen beinhalten?

Gruss, Jörg
Das würde auch ich (fast) nicht so genau sagen.

1. Du weißt nicht, was sich dahinter verbirgt. Wozu auch? Don't try the Kapsel.

2. Mutmaßlich wird es eine Liste von Kacheln sein. Das ist ja der große Vorteil von immutable Skalaren. Ein einfaches Beispiel:
Code:
NSString* firstName = @"Amin";
NSString* completeName = [firstName stringByAppendingString:@" Negm-Awad"];
Muss man da wirklich ein einziges Byte der Strings kopieren? Oder reicht es aus, im letztendlichen String-Objekt einfach zwei Zeiger auch Kacheln unterzubringen? (Es befinden sich drei String-Objekte im Sourcetext.)

Das hast du so häufig: Du denkst, dass eine Abstraktion (hier: Immutable Strings) etwas kostet und siehst nicht, dass es etwas bringt. Auch wenn es etwas Devotes hat: Vertraue darauf, dass bei Apple ganz gute Leute sitzen, jedenfalls Leute, die mehr Manpower haben als du. Dann ist die Antwort klar: Nutze, was sie dir geben. (Was übrigens auch Vorteile bezüglich der Optimierung im nächsten Release hat. –- Kostenlos!)
 
Das würde auch ich (fast) nicht so genau sagen.

1. Du weißt nicht, was sich dahinter verbirgt. Wozu auch? Don't try the Kapsel.

Ähm, na ja, reine Neugier?

BTW: Ich habe als Kind auch die Legobausteine aus den Bausätzen für Häuser, Flugzeuge etc. zusammengeworfen und ganz andere Dinge daraus zusammen gebaut ;-)

Gruss, Jörg
 
:-D
Aber wir hatten uns nunmal vorgenommen, plattformunabhaengig zu schreiben, weswegen wir um C++ nicht herum kommen...

Warum dann nicht Java? Nicht das Java so toll wäre (im Vergleich zu Objective C). Aber bevor man sich mit C++ rumqäult 8-)

Gruss, Jörg
 
Die Qual entsteht immer dann, wenn man Dinge verwenden muß, die nicht wirklich zusammenpassen. Cocoa und C++ ist ein Unding, Objective-C und die diversen C++ Frameworks geht ebenfalls nicht wirklich. Objective-C++ ist etwas unausgegohrenes, da es nicht wirklich mit modernen C++ Code harmoniert. Die Exceptions beider Sprachen werden wechselseitig nicht erkannt usw.
 
Es wird mit der neuen 64 Bit Runtime für Objective-C etwas besser. Da gibt es dann z.B. endlich unified exception handling für Objective-C und C++

Alex