版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2017.05.07 |
前言
前面我簡(jiǎn)單的寫(xiě)了些NSString的初始化,寫(xiě)了幾篇,都不難,但是可以對(duì)新手有一定的小幫助,對(duì)于大神級(jí)人物可以略過(guò)這幾篇,NSString本來(lái)就沒(méi)有難的,都是細(xì)枝末節(jié),忘記了查一下就會(huì)了,沒(méi)有技術(shù)難點(diǎn),下面我們繼續(xù)~~~
1. NSString簡(jiǎn)單細(xì)說(shuō)(一)—— NSString整體架構(gòu)
2. NSString簡(jiǎn)單細(xì)說(shuō)(二)—— NSString的初始化
3. NSString簡(jiǎn)單細(xì)說(shuō)(三)—— NSString初始化
4. NSString簡(jiǎn)單細(xì)說(shuō)(四)—— 從URL初始化
5. NSString簡(jiǎn)單細(xì)說(shuō)(五)—— 向文件或者URL寫(xiě)入
6. NSString簡(jiǎn)單細(xì)說(shuō)(六)—— 字符串的長(zhǎng)度
詳述
轉(zhuǎn)化為C字符串
一、- (const char *)cStringUsingEncoding:(NSStringEncoding)encoding;
看代碼。
/**
*1.- (const char *)cStringUsingEncoding:(NSStringEncoding)encoding;;
*
* @param encoding:The encoding for the returned C string. For possible values, see NSStringEncoding..
*
* @return :A C string representation of the receiver using the encoding specified by encoding. Returns NULL if the receiver cannot be losslessly converted to encoding.
*
*/
NSString *ocStr = @"AABBCC";
const char *cStr = [ocStr cStringUsingEncoding:NSASCIIStringEncoding];
NSLog(@"cStr--%s,cStr--%s",cStr,(const unichar *)cStr);
```
看輸出。
```
2017-05-07 10:03:44.700 NSString你會(huì)用嗎?[989:20867] cStr--AABBCC,cStr--AABBCC
```
**結(jié)論**:這里就是OC字符串轉(zhuǎn)化為C字符串,如果OC不能無(wú)損轉(zhuǎn)化為C字符串,則會(huì)返回NULL。返回的C字符僅僅當(dāng)原OC字符串被釋放或者內(nèi)存有空余的時(shí)候才會(huì)有效,如果需要存儲(chǔ)就需要調(diào)用getCString:maxLength:encoding:這個(gè)方法。你可以使用 canBeConvertedToEncoding來(lái)監(jiān)測(cè)是否有一個(gè)字符串可以根據(jù)某一個(gè)編碼進(jìn)行無(wú)損轉(zhuǎn)化,如果不能,可以使用dataUsingEncoding:allowLossyConversion:得到C字符串,但是可能會(huì)產(chǎn)生一定的損耗,注意這個(gè)方法返回的C字符串不是嚴(yán)格意義上的字符串,因?yàn)樗鼪](méi)有NULL結(jié)束標(biāo)識(shí)符。這里還要注意 NSUTF16StringEncoding, NSUTF32StringEncoding這兩種編碼格式不能用于這個(gè)方法。
-----------
### 二、-(BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;
先看一下參數(shù)吧。

看代碼。
```
/**
*2.- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;
*
* @buffer:Upon return, contains the converted C-string plus the NULL termination byte. The buffer must include room for maxBufferCount bytes.
* @maxBufferCount: The maximum number of bytes in the string to return in buffer (including the NULL termination byte).
* @param encoding:The encoding for the returned C string. For possible values, see NSStringEncoding..
*
* @return :YES if the operation was successful, otherwise NO. Returns NO if conversion is not possible due to encoding errors or if buffer is too small.
*
*/
NSString *ocStr = @"AABBCCDD";
char buffer[10];
NSUInteger maxBufferCount = 10;
BOOL isSuccess = [ocStr getCString:buffer maxLength:maxBufferCount encoding:NSUTF8StringEncoding];
if (isSuccess) {
NSLog(@"buffer--%s",(const unichar *)buffer);
}
```
看結(jié)果。
```
2017-05-07 10:22:19.991 NSString你會(huì)用嗎?[1227:30861] buffer--AABBCCDD
```
**結(jié)論**:如果轉(zhuǎn)化成功會(huì)返回YES,如果因?yàn)榫幋a錯(cuò)誤或者buffer空間太小的話就會(huì)返回NO;需要注意的是這里參數(shù)maxBufferCount不同于廢棄的方法getCString:maxLength:中的參數(shù),buffer的空間必須包括maxBufferCount的字節(jié)數(shù),這個(gè)數(shù)字必須包含返回的NULL終結(jié)符。
---------
### 三、@property(readonly) const char *UTF8String;
看代碼。
```
/**
*3.- @property(readonly) const char *UTF8String;
*
*/
NSString *ocStr = @"AABBCCDD";
const char *str = ocStr.UTF8String;
NSLog(@"%s---",str);
```
看輸出結(jié)果。
```
2017-05-07 11:07:35.566 NSString你會(huì)用嗎?[1779:59452] AABBCCDD---
```
**結(jié)論**:這個(gè)C字符串是指向OC字符串內(nèi)部結(jié)構(gòu)體指針,它的生命周期比原字符串要短,不會(huì)有很長(zhǎng)的生命周期,因此,如果你需要使用這個(gè)轉(zhuǎn)換后的字符串,你就需要在轉(zhuǎn)化完畢以后存儲(chǔ)一下。
# 后記
> ??今天周日了,明天又要上班了哦,哈哈,未完,待續(xù)~~~
