天天看點

Objective-C 學習第九天

一、

  1. 架構: 系統或者第三方事先寫好的寫很牛X功能的類,把這些類交給我們使用,這些類的集合就叫架構.

    Foundation架構: 是一個包,有很多類和函數,定義了一些資料類型.這個架構中的類都是一些最基礎的類.其他的架構都是基于Foundation架構的.

    UIKit.

    AVFoundation.

    ......

  2. NSString

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

    NSString的本質是一個類.

    最标準的建立NSString對象的方法:

    NSString *str1 = [NSString new]; NSString *str2 = [[NSString alloc] init]; NSString *str3 = [NSString string];

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

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

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

    使用字首@

    @"jack": 本質是一個NSString對象,存儲的是"jack"這個字元串

    NSString *str1 = @"rose";

    a. @"rose"本質是一個NSString對象,存儲的是字元串"rose"

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

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

    格式控制符%@: 列印指針指向的對象

  3. NSString對象的恒定性

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

    NSString *str = @"jack";

    當我們調用NSString的類方法來建立對象的時候, 建立的對象是存儲在堆區的.

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

    NSString *str = [NSString new];

    2). 恒定性

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

    當我們重新為字元串指針初始化值的時候,并不是修改原來的字元串對象,而是重新的建立一個字元串對象,将這個字元串對象的位址重新指派給字元串指針變量.

    3). 當系統準備要在記憶體中建立字元串對象的時候,會先檢查記憶體中是否有相同内容的字元串對象,如果有直接指向,如果沒有才會重新建立.

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

  4. NSString類中使用頻率最高的方法

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

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

    int age = 10;
        NSString *str = @"jack";
        NSString *newStr = [NSString stringWithFormat:@"大家好,我叫%@,今年%d歲",str,age];
               

    2). 得到字元串的長度

    @property (readonly) NSUInteger length;

    NSString *str = @"jack";
        NSUInteger len = str.length;
               

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

    - (unichar)characterAtIndex:(NSUInteger)index;

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

    NSString *str = @"jack";
        unichar ch = [str characterAtIndex:2];
        NSLog(@"ch = %C", ch);
               

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

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

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

    c. 是以如果我們要比較兩個OC字元串的内容是否相同,不能使用==去比較.因為==比較的是字元串指針變量的值,而我們比較的是字元串的内容

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

    可以比較字元串的内容

    NSString *str1 = @"jack";
        NSString *str2 = @"jack";
        [str1 isEqualToString:str2];
               

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

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

    char *str = "jack";
        NSString *str1 = [NSString stringWithUTF8String: str];
               

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

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

    NSString *str = @"jack";
        const char *str1 = str.UTF*String;
               
  5. 字元串讀寫

    1). 将一個字元串寫入到磁盤上的某一個檔案

    • (BOOL) writeToFile:(NSString *)path atomically:(BOOL)userAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

      參數1: 将字元串内容寫入到哪一個檔案之中,寫上檔案的路徑.

      參數2: YES,先将内容寫入到一個臨時檔案,如果成功過再搬到指定的目錄; NO,直接将内容寫入到指定的檔案,不安全,效率高

      參數3: 指定寫入的時候的編碼.一般情況下使用UTF8. NSUTF8StringEncoding

      參數4: 二級指針,要傳遞一個NSError指針的位址.如果寫入成功,這個指針的值就是nil,如果失敗,這個指針就會指向一個錯誤對象,這個對象描述了發生錯誤的資訊. err.localizedDescription中存儲發生錯誤的資訊

      傳回值是BOOL類型,代表是否寫入成功.

    NSString *str = @"jack";
        NSError *err;
        [str writeToFile:@"/Users/Itcast/Desktop/abc.txt", atomically:NO encoding:NSUTF8StringEncoding error:&err];
               
    2). 從磁盤檔案讀取内容
    • (instancetype) stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

      參數1:檔案的路徑

      參數2:使用的編碼NSUTF8StringEncoding

      參數3:錯誤對象

    NSError *err;
        [NSString stringWithContentsOfFile:@"/Users/Itcast/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:&err];
               
  6. 使用URL來讀寫字元串資料.

    1). 優勢: 皆可以讀取本地磁盤檔案,還可以讀寫網頁檔案、ftp伺服器檔案

    2). 不同類型的URL位址的寫法

    a. 本地磁盤檔案: file://+路徑---->file:///Users/Itcast/Desktop/abc.txt

    b. 網頁位址:

    http://www.baidu.com/ c. ftp伺服器檔案的位址: ftp://server.itcast.cn/1.txt
    1. 将不同類型的位址封裝在NSURL對象中

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

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

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

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

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

    NSURL *u1 = [NSURL URLWithString:@"http://www.itcast.cn"];
        NSString *str = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:nil];
               
    NSURL *u1 = [NSURL URLWithString:@"file:///Users/Itcast/Desktop/abc.txt"];
        NSString *str = @"hehehe";
        BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:nil];
    
               
  7. 字元串比較

    1). 不忽略大小寫

    • (NSComparisonResult)compare:(NSString *)string;
    NSString *str1 = @"hehehe";
        NSString *str2 = @"jack";
        NSComparisonResult res = [str compare:str2];
        swith(res){
            case NSOrderedAscending://str1小
            break;
            case NSOrderedSame://一樣大
            break;
            case NSOrderedDescending://str2小
            break;
            default:
            break;
        }
               
    2). 忽略大小寫
    NSString *str1 = @"hehehe";
        NSString *str2 = @"JACK";
    
        NSComparisonResult res = [str compare:str2 option:NSCaseInsensitiveSearch];
        swith(res){
            case NSOrderedAscending://str1小
            break;
            case NSOrderedSame://一樣大
            break;
            case NSOrderedDescending://str2小
            break;
            default:
            break;
        }
               
    3). 比較字元串中的數字
    NSString *str1 = @"hehehe001";
        NSString *str2 = @"hehehe002";
    
        NSComparisonResult res = [str compare:str2 option:NSNumericSearch];// 隻能比格式固定的
        swith(res){
            case NSOrderedAscending://str1小
            break;
            case NSOrderedSame://一樣大
            break;
            case NSOrderedDescending://str2小
            break;
            default:
            break;
        }
               
    4). 判斷是否以某個字元串開頭
    NSString *str = @"http://www.baidu.com/";
        BOOL res = [str hasPrefix:@"http://"];
               
    5). 判斷是否以某個字元串結束
    NSString *str = @"/Users/Apple/Music/我們不一樣.mp3";
        BOOL res = [str hasSuffix:@".mp3"];
               
  8. 在主串中搜尋子串

    1). 從前往後

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

    傳回值NSRange類型的結構體變量

    typedef struct _NSRange{ NSUInteger location;//代表子串在主串出現的下标 NSUInteger length;//代表子串在主串中比對的長度 } NSRange;

    NSString *str = @"i love itcast!"; // 在str字元串中搜尋@"love"出現的範圍 NSRange range = [str rangeOfString:@"love"]; if(range.location==NSNotFound){ // 沒有找到 } else { // 找到了 } 或者 if(range.length==0){ // 沒有找到 } else { // 找到了 }

    2). 從後往前

    NSString *str = @"i love itcast love!"; // 在str字元串中搜尋@"love"出現的範圍 NSRange range = [str rangeOfString:@"love" options: NSBackwardsSearch]

  9. NSRange結構體

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

    typedef struct _NSRange{ NSUInteger location;//代表子串在主串出現的下标 NSUInteger length;//代表子串在主串中比對的長度 } NSRange;

    NSRange range;

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

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

    a. 最原始的方式

    NSRange range; range.location = 3; range.length = 4;

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

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

    d. Foundation架構中定義了一個函數,這個函數可以快速的建立一個NSRange結構體.

    NSMakeRange(loc, len);傳回一個指定屬性的NSRange結構體變量

    NSRange range = NSMakeRange(3,7);

    5. 可以将NSRange結構體變量轉換為NSString.

    NSString *str = NSStringFromRange(range);

  10. 字元串截取

    1). 取到字元串中的一部分

    • (NSString *)substringFromIndex(NSUIntege)from;

      從指定的下标處一直截取到最後

    NSString *str = @"背景連鎖酒店分開計算懶死了";
        NSString *newStr = [str substringFromIndex:3];
               
    2). 從第0個開始截取指定的個數
    • (NSString *)substringToIndex(NSUIntege)to;

      3). 從指定位置截取指定長度的字元串

    • (NSString *)substringWithRange(NSRange)range;
  11. 字元串替換

    1).

    • (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;

      将字元串中第一個參數替換為第二個參數,原來的指針指向的内容是不會變的,新串是以方法的傳回值傳回的.

    NSString *str = @"背景連鎖酒店分開計算懶死了";
        NSString *newStr = [str stringByReplacingOccurrencesOfString:@"背景" withString:@"廣州"];
               
  12. 字元串資料轉換為其他類型

    @property (readonly)double doubleValue;

    @property (readonly)float floatValue;

    @property (readonly)int intValue;

    @property (readonly)NSUINteger integerValue;

    @property (readonly)long long longLongValue;

    @property (readonly)BOOL boolValue;

    轉換注意:

  13. 其他

    1). 去掉字元串前後的空格

    NSString *str = @" Jack ";
        [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
               
    2). 将字元串轉換為大寫或者小寫
    NSString *str = @" Jack ";
        [str uppercaseString];
        [str lowercaseString];
               

二、

  1. NSMutableString

    1). 是Foundation架構中的一個類,從NSString繼承,是用來存儲字元串資料的.

    2). NSMutableString在父類NSString的基礎之上做擴充,存儲在NSMutableString對象中的資料具有可變性,不會新建立對象.

  2. NSMutableString的用法

    1). 建立對象

    NSMutableString *str = [NSMutableString string];
        [str appendString:@"jack"];
               
    2). 往可變字元串對象中追加字元串
    • (void)appendString:(NSString *)aString;// 直接追加内容
    • (void)appendFormat:(NSString *)format...;// 以拼接的方式往可變字元串對象中追加内容

      3). 建立NSMutableString對象時,不能使用如下方式:

    NSMutableString *str = @"jack";
               
    4). NSMutableString做大批量的字元串拼接,速度快,因為NSMutableString隻有一個,每次修改的時候直接修改對象的内容
  3. 使用建議

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

    2). 大批量的資料拼接的時候使用NSMutableString

    10次以上使用NSMutableString.

  4. NSArray

    1). 是Foundation架構中的一個類,用來存儲多個資料,具備數組功能,是以NSArray是OC中的數組

    2). 特點:

    a. 隻能存儲OC對象

    b. 長度固定,一旦NSArray數組建立完畢之後,元素的長度固定,無法新增、删除元素.

    c. 每一個元素都是緊密相連的,每一個元素仍然有自己的下标.

    d. 元素的類型是id類型的

    3). NSArray數組的建立

    1). 因為是一個類,是以就是建立NSArray對象.

    NSArray *arr1 = [NSArray new]; NSArray *arr2 = [[NSArray alloc] init]; NSArray *arr3 = [NSArray array];

    這樣建立出來的NSArray數組的元素的個數是0個,因為長度固定,是以沒有任何意義.

    2). 建立數組的同時指定一個數組的元素,仍然沒有意義

    NSArray *arr1 = [NSArray arrayWithObject:@"jack"];

    3). 最常用建立NSArray數組的方式.

    + (instancetype)arrayWithObjects:(ObjectType)firstObj,...

    NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",nil];

    4). 建立NSArray簡要方式

    NSArray *arr = @[@"jack", @"rose", @"lili"];

    5). 使用注意

    a. 隻能存儲OC對象,不能存儲非OC對象

    b. 将元素寫完之後,最後要寫一個nil,表示元素到此結束了

  5. NSArray數組的編譯

    1). for循環

    原理: 将下标挨個周遊出來

    NSArray *arr = @[@"jack",@"rose"];
        for(int i=0;i<arr.count;i++){
            //NSLog(@"%@",arr[i]);
            NSLog(@"%@", [arr objectAtIndex:i]);
        }
               

    2). 使用增強for循環

    a. 文法格式:

    for(元素類型 變量名 in 數組名){

    直接通過變量名拿到數組中的每一個元素

    }

    NSArray *arr = @[@"jack",@"rose"]; for(NSString *str in arr){ NSLog(@"%@", str); }

    b. 聲明在for()中的變量叫做疊代變量

    c. 執行變量

    将數組中的第一個元素的值指派給疊代變量,執行循環體

    ...

    結束循環

    d. 文法總結

    -> 疊代變量的類型和數組中的元素的類型保持一緻

    -> 疊代變量的名稱可以任意取

    -> in是固定的

    -> 周遊那個數組就将數組寫在in後面

    -> 循環體裡面,疊代變量的值就是元素的值

    當NSArray數組中存儲的資料類型不一緻的時候,疊代變量的類型建議使用id類型
               
    1. 使用block周遊
      • (void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;

        這是一個方法,這個方法作用來周遊數組中的每一個元素

      NSArray *arr = @[@"jack",@"rose"];
          // 将arr數組中的每一個元素周遊出來
          [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){
              NSLog(@"%@", obj);
              // 如果想停止循環,就将*stop設定為YES
          }]; 
                 
  6. NSArray和NSString

    1). 将數組中元素連接配接起來組成一個新的字元串

    • (NSString *)componentsJoinedByString:(NSString *)separator

      參數: 連接配接符

    NSArray *arr = @[@"jack", @"rose", @"lili"];
        NSString *str = [arr componentsJoinedByString:@"#"];
               
    2). 将字元串按指定分隔符分割
    NSString *str = @"北京,昌平區,傳智";
        // 使用字元串進行分割
        NSArray *arr = [str componentsSeparatedByString:","];
               
  7. NSMutableArray是NSArray的子類

    1). NSMutableArray仍然是一個數組,就被NSArray的特點,隻能存儲OC對象,每一個元素是緊密相連的。

    2). NSMutableArray相對于父類做的擴充,NSMutableArray數組的元素可以動态的新增和删除,其他用法與NSArray一緻。

    是以:

    NSArray數組一旦建立,其元素的個數就固定,無法新增與删除

    NSMutableArray數組,可以新增删除

    3). NSMutableArray數組的建立

    NSMutableArray *arr1 = [NSMutableArray new]; NSMutableArray *arr2 = [[NSMutableArray alloc] init]; NSMutableArray *arr3 = [NSMutableArray array];

    這樣建立出來的數組對象,數組的元素是0,但是有意義,可以動态的新增,删除.

    最容易犯錯:這樣寫不可以

    NSMutableArray *arr1 = @[@"jack", @"rose", @"lili"];

  8. 新增與删除
    1. 新增

      a. // 将傳入的參數作為數組的元素添加進去

      - (void)addObject:(ObjectType)anObject;

      // 将另外一個數組中的每一個元素添加到可變數組中

      - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;

      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr];

      b. 在可變數組中指定的數組中插入一個元素

      - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;

      [arr insertObject:@"lilei", anIndex:1];

    2. 删除

      a. 删除

      // 删除指定下标的元素

      - (void) removeObjectAtIndex:(NSUInteger)index;

      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObjectAtIndex:1];

      b. 删除特定的元素

      - (void)removeObject:(ObjectType)anObject;

      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObject:@"lili"];

      c. 删除指定範圍内的元素

      - (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;

      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObject:@"lili" inRange:NSMakeRange(0, 3)];

      d. 删除最後一個元素

      - (void)removeLastObject;

      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeLastObject];

      e. 删除所有

      - (void)removeAllObjects;

      NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeAllObjects];

  9. NSNumber

    1). 作用: 包裝基本資料類型

    NSNumber *number = [NSNumber numberWithInt:10];
        等價于
        NSNumber *number = @10;
               

繼續閱讀