iOS開發備忘筆記 (持續更新中)

Hext123發表於2018-06-14
  1. NSString常量定義:

    正確:

     NSString * const name = @"value";
    複製程式碼

    錯誤:

     const NSString * name = @"value"; 
     NSString const * name = @"value";
    複製程式碼

    總結: const* 前 代表 *name 不可變, 在 * 後代表 name不可變. 我們一般都 是想讓 name 的值不變, 所以應該把 const 放在 * 後;

  2. 格式化日期輸出星期的不同表示:

     NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
     dateFormatter.dateFormat = @"E EE EEE EEEE EEEEE EEEEEE EEEEEEE";
     NSString * dateStr = [dateFormatter stringFromDate:[NSDate date]];
     NSLog(@"%@", dateStr);
     //輸出:    週六 週六 週六 星期六 六 週六 週六
    複製程式碼
  3. UICollectionView 更新資料來源 和 更新介面一定要一對一. (備忘, 有空補充程式碼)

  4. URL編碼 (先備忘, 有空補說明):

    C方法:

     str = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)str,NULL,CFSTR("%+ /?#&="),kCFStringEncodingUTF8));
    複製程式碼

    OC方法:

     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    複製程式碼

    OC新方法:

     - (nullable NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters NS_AVAILABLE(10_9, 7_0);
    複製程式碼
  5. UITableView 不同 style 的區別 :

    iOS7 之後, 不同 UITableViewStyle 的外觀基本上相同了, 那它們還有什麼不易見的區別呢:

    • UITableViewStylePlain :

      1. SectionHeaderFooter 的高度預設為 0 ;
      2. 並且 Section 的頭腳檢視會懸停在最上方和最下方;
    • UITableViewStyleGrouped :

      1. 同上相反, Section的頭腳高度必須不能為 0 . 為 0 設定無效, 系統會預設一個高度, 如果不需要可以設定一個很小的小數;
      2. Section 的 頭腳檢視不會懸停在上面和下面, 會隨著表格一起滑動;
  6. git 不能跟蹤檔名大小寫的改變, 造成一些問題怎麼辦?

    (如: 圖片名稱改了大小寫, 但是git沒有提交這一改變, 造成下次檢出程式碼執行APP時讀取不到圖片)

    1. git設定為大小寫敏感:

      • 命令列:

          git config core.ignorecase false
        複製程式碼
      • 直接修改.git資料夾的config檔案中

          ignorecase = false
        複製程式碼
    2. 如果已經出問題, 可以 先刪除檔案,再新增進去

  7. 導致JSON不能正確解析的字元 :

    • 經過測試: 遍歷所有Unicode字元 (UCS-2標準 0 - 65536 ), 迴圈放入json中解析, 發現有34個字元出現解析失敗, 前32個字元為ASCII碼為 0 - 31 的控制字元 , 另外兩個為 "\ .

      (ASCII碼:實際字元)
      (
          "0:",
          "1:",
          "2:",
          "3:",
          "4:",
          "5:",
          "6:",
          "7:\a",
          "8:\b",
          "9:\t",
          "10:\n",
          "11:\v",
          "12:\f",
          "13:\r”,
          "14:",
          "15:",
          "16:",
          "17:",
          "18:",
          "19:",
          "20:",
          "21:",
          "22:",
          "23:",
          "24:",
          "25:",
          "26:",
          "27:",
          "28:",
          "29:",
          "30:",
          "31:",
          "34:\"",
          "92:\\"
      )
      複製程式碼
    • 解決方法: 在解析JSON之前替換掉或去掉這些字元:

      1. 使用迴圈替換為空的辦法 , 效能消耗0.01秒以內 且大部分json在0.001秒以內:

        /**
          *  刪除特殊字元
          */
        +(NSString *)deleteSpecialCharacters:(NSString *)str{
            
            //刪除影響 JSON 解析的字元 : [ASCII碼:0~31 以及 " \ ] 共34個字元 , " \ 一般不能直接去掉,需要單獨處理.
            
            for (int i = 0; i <= 31; i++) {
                NSString *value = [NSString stringWithFormat:@"%C",(unichar)i];
                str = [str stringByReplacingOccurrencesOfString:value withString:@""];
            }
            return str;
        }
        複製程式碼
      2. 優化特殊字元的替換方式, 現在效率比以前高10倍, json串替換基本都在0.001秒以內:

        /**
          *  刪除特殊字元
          */
        +(NSString *)deleteSpecialCharacters:(NSString *)str{
        
            //使用此方法效率比上面快5-10倍, 用 NSString -componentsSeparatedByCharactersInSet: 在控制字元處將字串分割成一個 NSArray;再用一個 NSPredicate 去除空串;最後,用 NSArray -componentsJoinedByString: 用單個空格符將陣列重新拼成字串
            //[NSCharacterSet controlCharacterSet] 控制字符集 ASCII碼(0~31 and 127)
            NSArray<NSString *> *components = [str componentsSeparatedByCharactersInSet:[NSCharacterSet controlCharacterSet]];
            components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]];
            str = [components componentsJoinedByString:@" "];
            
            return str;
        }
        
        複製程式碼
  8. int a; //a不一定等於0

    //錯誤
    int a;
    a++;
    
    //正確
    int a = 0;
    a++;
    複製程式碼
  9. 取一個int型變數的絕對值, 用abs()函式有風險. (當值為-2147483648的時候)

    //首先我們來看int的範圍:
    NSLog(@"%i", INT_MIN); //輸出 -2147483648
    NSLog(@"%i", INT_MAX); //輸出 2147483647
    
    //我們知道int的範圍是: -2147483648 ~ 2147483647
    
    //然後我們用 abs() 函式取 -2147483648 的絕對值:
    NSLog(@"%i",abs(-2147483648)); //輸出 -2147483648, 並且Xcode報警告
    
    //為什麼呢? -2147483648 的絕對值不應該是 2147483648 嗎? 這是因為 2147483648 超過int的最大值(2147483647)了, 所以最高位被截斷了
    
    //所以不能用 abs() 函式來取 -2147483648 的絕對值, 這個函式的引數和返回值都是int型;
    //我們應該使用 labs() 函式, 這個函式的引數和返回值都是long型
    
    NSLog(@"%li",labs(-2147483648)); //輸出 2147483648
    
    //好了, 這下結果正確了, 當然這只是極端的情況, 一般情況還是可以放心使用 abs() 函式
    複製程式碼

相關文章