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.

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.

Nincsenek hozzászólások.
süti beállítások módosítása