2009.06.02. 09:49
Miért kell @ a stringek elé?
Kezdő iPhone milliomosként, mikor először láttam ObjC forrást, a legfurább az volt (azon kívül, hogy [] között van a metódushívás), hogy minden @"string"
előtt ott egy kukac.
Elég szokatlanul néz ki elsőre, de mindennek megvan az oka.
char *cString = "Ódivatú C string vagyok"; NSString *nsString = @"Okosügyes NSString objektum vagyok";
Bizonyára tudod, hogy az Objective C a sima C-nek egy kibővítése. Sima C-ben sem objektumok nincsenek, sem stringek. Ha kukac nélkül írsz be egy stringet, az egy char tömb lesz, és egy pointert kapsz a legelső karakterre. Ez valljuk be, nem túl objektumorientált.
Ha a nyitó idézőjel elé egy @-ot teszel, akkor a fordító egy
NSString
objektumot fog legyártani a megadott karakterekből.
C String és NSString
Fő különbség a kettő között, hogy az NSString minden esetben Unicode karakterekből áll, míg egy C string bármilyen kódolású lehet. Fontos tudni, hogy az NSString immutable, vagyis létrehozás után nem módosítható. Másik érdekesség, hogy a @-cal létrehozott stringek mindvégig a memóriában maradnak, hiába release-eljük őket (?).
A két formátum között az
- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; + (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc //és a - (const char *)cStringUsingEncoding:(NSStringEncoding)encoding;
metódusok biztosítják az átjárást. Mindkét esetben meg kell adni a kódolást. A választékot az NSString.h
-ban találjuk:
/* Note that in addition to the values explicitly listed below, NSStringEncoding supports encodings provided by CFString. See CFStringEncodingExt.h for a list of these encodings. See CFString.h for functions which convert between NSStringEncoding and CFStringEncoding. */ enum { NSASCIIStringEncoding = 1, /* 0..127 only */ NSNEXTSTEPStringEncoding = 2, NSJapaneseEUCStringEncoding = 3, NSUTF8StringEncoding = 4, NSISOLatin1StringEncoding = 5, NSSymbolStringEncoding = 6, NSNonLossyASCIIStringEncoding = 7, NSShiftJISStringEncoding = 8, NSISOLatin2StringEncoding = 9, NSUnicodeStringEncoding = 10, NSWindowsCP1251StringEncoding = 11, /* Cyrillic; same as AdobeStandardCyrillic */ NSWindowsCP1252StringEncoding = 12, /* WinLatin1 */ NSWindowsCP1253StringEncoding = 13, /* Greek */ NSWindowsCP1254StringEncoding = 14, /* Turkish */ NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */ NSISO2022JPStringEncoding = 21, /* ISO 2022 Japanese encoding for e-mail */ NSMacOSRomanStringEncoding = 30, NSUTF16StringEncoding = NSUnicodeStringEncoding, /* An alias for NSUnicodeStringEncoding */ #if MAC_OS_X_VERSION_10_4 <= MAC_OS_X_VERSION_MAX_ALLOWED NSUTF16BigEndianStringEncoding = 0x90000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */ NSUTF16LittleEndianStringEncoding = 0x94000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */ NSUTF32StringEncoding = 0x8c000100, NSUTF32BigEndianStringEncoding = 0x98000100, /* NSUTF32StringEncoding encoding with explicit endianness specified */ NSUTF32LittleEndianStringEncoding = 0x9c000100 /* NSUTF32StringEncoding encoding with explicit endianness specified */ #endif }; typedef NSUInteger NSStringEncoding;
Mindent megtudhattok az NSString programozásáról a String Programming Guide for Cocoa doksiból.
Szólj hozzá!
Címkék: c kukac string objective c objc sztring nsstring c string
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.