天天看點

最簡單的IOS - Foundation架構 NSString

  1.架構:就是系統(蘋果)或者第三方(其他的一些高手)事先寫好了一些很牛X功能的類.

         把這些類交給我們使用.這些類的集合我們叫做架構.

         架構中有很多很多功能相似的類.函數庫

     Foundation架構: 是1個包這裡面有很多類、函數、定義了一些資料類型.

                      這個架構中的類都是一些最基礎的類. NSString NSObject

                     其他的架構都是基于Foundation架構的.

     UIKit.

     AVFoundation.

     ......

  2. Foundation架構中的最常用的類.簡單的爆.量大.

  3. NSString

     1). NSString是1個資料類型.儲存OC字元串的.

         NSString的本質是1個類.既然是1個類.

         是以,最标準的建立NSString對象的方式:

         NSString *str1 = [NSString new];

         NSString *str2 = [[NSString alloc] init];

         NSString *str3 = [NSString string];

        使用這種方式建立的字元串是1個空的字元.  @""

         NSString對象就是用來存儲字元串.

     2). NSString是OC中最常用的1個類了.是以OC提供了一種更為快速的建立字元串對象的方式.

         使用字首@

         @"jack"; 本質上這是1個NSString對象.這個NSString對象中存儲的是"jack"這個字元串.

        NSString *str1 = @"rose";

        1).  @"rose"本質上是1個NSString對象,這個對象中存儲的是字元串"rose".

        2).  将這個字元串對象的位址傳回指派給str1指針.

        格式控制符%p:列印指針變量的值.列印位址.

                  %@: 列印指針指向的對象.

  4. NSString的恒定性.

     1).當我們使用簡要的建立字元串對象的時候.也就是使用1個OC字元串常量來初始化字元串指針的時候.

        這個字元串對象是存儲在常量區(資料段)的.

         NSString *str = @"jack";

         當我們調用NSString的類方法來建立對象的時候.

         NSString *str =  [NSString stringWithFormar:@"jack"];

         NSString *str1 = [NSString new];

        建立的字元串對象是存儲在堆區.

     2).當在記憶體中建立1個字元串對象以後.這個字元串對象的内容就無法更改.

        當我們重新為字元串指針初始化值的時候.并不是修改原來的字元串對象 

        而是重新的建立1個字元串對象将這個字元串對象的位址重新複制給字元串指針變量.

     3).當系統準備要在記憶體中建立字元串對象的時候.會先檢查記憶體中是否有相同内容的字元串對象.

        如果有,直接指向.如果沒有才會重新建立.

     4).存儲在常量區的資料不會被回收.是以存儲在常量區的字元串對象也不會被回收.

   5. NSString是1個類.那麼肯定其中有很多的方法.

  6.使用頻率最最高的幾個方法.

     1). 使用拼接的方式建立1個NSString對象.

         + (instancetype)stringWithFormat:(NSString *)format, ... 

     2). 得到字元串的長度.

         @property (readonly) NSUInteger length;

     3).得到字元串中指定下标的字元.

         - (unichar)characterAtIndex:(NSUInteger)index;

         傳回值是unichar類型的要列印的話使用%C

     4).判斷兩個字元串的内容是否相同.

         a. 能否使用 ==來判斷兩個OC字元串的内容是否相同.

         b. ==運算符的作用:比較左右兩邊的資料是否相同.

            ->   10 == 10 這個時候直接比較的是左右兩邊的資料是否相同.

            ->   a == b  兩邊也可以寫1個變量.這個時候比較是左右兩邊的變量的值是否相同.

            ->  如果兩邊是1個指針變量.那麼比較的也是變量的值.隻不過指針變量的值是位址.

         c.是以,如果我們要比較兩個OC字元串的内容是否相同.不能使用 == 去比較.

           因為 ==比較的是字元串指針變量的值.而我們要比的是兩個字元串指針指向的字元串對象的内容是否相同.

         c. 調用方法: 

            - (BOOL)isEqualToString:(NSString *)aString;

           就可以比較目前字元串對象和傳入的字元串對象的内容是否相同.

     5).将C語言的字元串轉換為OC字元串對象.

         + (instancetype)stringWithString:(NSString *)string;

     6).将OC字元串對象轉換為C語言的字元串.

         @property (nullable, readonly) __strong const char *UTF8String

   7.将字元串寫入到指定的檔案中.

     - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

  8.将檔案中的内容讀取到字元串中.

     + (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

     nullable 代表傳回的對象有可能是nil

  9. 使用NSURL讀寫資源.

     1). NSURL對象.專門用來儲存資源位址的.資源位址:本地磁盤路徑、網頁位址、ftp檔案位址.

     2). 資源路徑的位址的寫法:

         http://   開頭的是網頁路徑的寫法.

         file://   開頭的是本地磁盤的路徑

         ftp://    開頭的是ftp檔案資源的路徑

        如果要講1個資源路徑的位址儲存到NSURL對象中位址一定要是标準寫法.

     3). 如何将資源位址存儲到NSURL對象中.

         NSURL *url1 = [NSURL URLWithString:@"http://www.itcast.cn"];

         NSURL *url2 = [NSURL URLWithString:@"ftp://server.itcast.cn/ccc.txt"];

         NSURL *url3 = [NSURL URLWithString:@"file:///Users/Apple/Desktop/abc.txt"];

     4).字元串就提供了對應的方法去讀寫NSURL對象中封裝的資源路徑

        從指定資源路徑讀取文本内容.

         + (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;

        将字元串的内容寫入到資源路徑中.

         - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

        如果要向網頁或者ftp寫内容要有權限.

  9. 字元串比較.

     - (NSComparisonResult)compare:(NSString *)string;

  10.字元串比較:忽略大小寫的比較:

  11.字元串的相等判斷.

  12.判斷字元串是否以指定的字元串開頭

     - (BOOL)hasPrefix:(NSString *)str;

  13.判斷字元串是否以指定的字元串結尾

     - (BOOL)hasSuffix:(NSString *)str;

  14.在主串中搜尋子串.從前往後

     - (NSRange)rangeOfString:(NSString *)searchString;

     傳回值是1個NSRange類型的結構體變量.

     typedef struct _NSRange {

         NSUInteger location;代表子串在主串出現的下标.

         NSUInteger length;代表子串在主串中比對的長度.

     } NSRange;

     如果沒有找到:

     location 為NSUInteger的最大值,也就是NSNotFound

     length 的值為0

    這個方法,是從前往後搜尋.第1次比對的子串.

  15.在主串中搜尋子串.從後往前.

        NSString *str = @"i love itcast love!";

        NSRange range =  [str rangeOfString:@"love" options:NSBackwardsSearch];

 16. NSRange結構體.

     1). 是Foundation架構中定義的1個結構體.

         typedef struct _NSRange {

            NSUInteger location;

            NSUInteger length;

         } NSRange;

         NSRange range;

        這個結構體變量一般情況下用來表示1段範圍.特别用在子串在主串中的範圍表示.

        @"hahajackhehe" @"jack" 

         4  4

        NSRange range = {4, 4};

    2).聲明并初始化結構體變量的方式.

        1). 最原始的方式.

             NSRange range;

             range.location = 3;

             range.length = 4;

        2). 第二種方式:    NSRange range = {3, 7};

        3). 第三種方式:   NSRange range = {.location = 3,.length = 7};

        4). Foundation架構中定義了1個函數.這個函數可以快速的建立1個NSRange結構體會,

            NSRange range =  NSMakeRange(loc, len);

            傳回1個指定屬性的NSRange結構體變量.

        5). Foundation架構中定義了1個函數可以将1個NSRange結構體變量轉換為NSString

             NSStringFromRange(ran)函數可以将NSRange結構體變量轉換為指定格式的字元串.

  17. 字元串的截取.

    取到字元串中的1部分.

     - (NSString *)substringFromIndex:(NSUInteger)from;從指定的下标出一直截取到最後.

     - (NSString *)substringToIndex:(NSUInteger)to;從第0個開始截取指定的個數.

     - (NSString *)substringWithRange:(NSRange)range;截取指定的1段範圍.

  18.字元串的替換

     - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement

    将字元串中第1個參數替換為第2個參數.友情提示:原來的指針指向字元串的内容是不會變的 會全部替換.

    新串是以方法的傳回值傳回的.

    這個方法還可以做删除.原理:将其替換為@""

  19.字元串資料轉換為其他的類型.使用頻率很高.

     @property (readonly) double doubleValue;

     @property (readonly) float floatValue;

     @property (readonly) int intValue;

     @property (readonly) NSInteger integerValue

     @property (readonly) long long longLongValue

     @property (readonly) BOOL boolValue

    轉換注意.從頭開始轉換,能轉換多少就是多少.到遇到不能轉換的時候就停止轉換.

  20.去掉字元串前後的空格.

     str =  [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    中間的空格無法去掉.

  21.字元串的恒定性.

    一旦建立1個字元串對象,那麼這個字元串對象的内容就無法更改,當我們修改字元串的時候,其實是重新的建立了1個字元串對象.

     代碼案例:

     NSLog(@"-------------------");

     NSString *str = @""; //@""

     for(int i = 0; i < 50000; i++)

     {

        str = [NSString stringWithFormat:@"%@%d",str,i];

     }

     NSLog(@"-------------------");

    會耗費很長的時間.每次循環的時候都會建立1個新的字元串對象.50000個,

    因為字元串的恒定性.

 22.如何讓這樣的大批量的字元串拼接可以更加快速的1點.

    1).慢得原因:因為字元串的恒定性,每次修改字元串的時候,是重新的建立1個對象,

    2).希望:有沒有一種對象是用來存儲字元串的,并且存儲在這個對象中的字元串資料可以更改.

 23. NSMutableString

    1). 是Foundation架構中的1個類.從NSString繼承.

        是以,NSMutableString對象是用來存儲字元串資料的.

    2). NSMutbaleString在父類NSString的基礎之上的做擴充.

        存儲在NSSMutableString對象中的字元串資料可以更改.具備可變性.

        直接可以改存儲在NSMutableStirng對象中的字元串資料,不會新建立對象.

 24. NSMutableString的用法

    1).既然是1個類,要使用的話,就得建立1個對象.

        NSMutableString *str = [NSMutableString string];

    2).往可變字元串對象中追加字元串.

         - (void)appendString:(NSString *)aString; 直接追加内容.

         - (void)appendFormat:(NSString *)format, ...以拼接的方式往可變字元串對象中追加内容.

    3). 建立NSMutableString對象的時候,記住下面這樣的初始化方式是不行的.

        NSMutableString *str = @"jack";

        @"jack" 是1個NSString對象,是1個父類對象.

        而str指針是1個NSMutableString類型的是1個子類類型的.       

       如果通過子類指針去調用子類獨有的成員就會運作錯誤.

    4). NSMutableString從NSString繼承.

        在使用NSString的地方完全可以使用NSMutableString

  25. 使用NSMutableString來做大批量的字元串拼接.

     NSLog(@"~~~~~~~~~~~~");

     NSMutableString *str = [NSMutableString string];

     for(int i = 0; i < 100000; i++)

     {

        [str appendFormat:@"%d",i];

     }

     NSLog(@"~~~~~~~~~~~~");

   這個時候 "biu"的一下就結束了.為什麼這麼快>?因為NSMutableString隻有1個.每次修改的時候直接修改的是這個對象中的資料.

 26. 使用建議

    1). 我們平時使用的時候,還是使用NSString.因為效率高.

        NSString *str1 = @"jack";

        NSString *str2 = @"jack";

    2). NSMutbaleString:隻在做大批量的字元串拼接的時候才使用.

        大量拼接的時候,就不要去使用NSString因為效率低下.\

        10次以上.