開發中碰見的小坑 (一)


前言

小夥伴們在開發中不免會遇到問題, 你是如何解決問題的?不妨也分享給你們!若是此文章其中的任何一條問題對你們有幫助,那麼它的存在是有意義的! 反正無論怎樣遇到問題就要去解決問題, 在解決問題的同時也是提升開發經驗的渠道!web

1.既然有問題咱們該怎樣解決 ?

首先大部分人都會去百度搜索來解決問題, 誰都不例外, 但是百度這東西會有不少誤解, 甚至誤人子弟, 同時解決問題的效率也不是很高, 若是是技術問題能夠去:網絡

  • Google 簡單來講比百度搜索的答案相對要多,要更準確效率更高, 建議使用英文搜索
  • Stack Overflow 一個與程序相關的IT技術問答網站, 簡單來講工做中的70%問題在這裏都能解決

搜索是解決問題的一種辦法, 那麼剩餘30%的問題仍是須要本身獨立去解決, 那麼有人會問有沒有能提升獨立解決問題的辦法呢 ? 好比: 積累所遇到的崩潰信息, 學會查看崩潰信息, 查看官方文檔的技巧等等) 本文暫時不會詳解, 有時間的話須要單獨寫一篇文章來探究如何高效的解決崩潰問題!函數

2.用斷點調試崩潰問題的小技巧
  • (1)若是當前斷點指向內存, 那麼就是初始化時分配內存時有問題
  • (2)添加全局斷點的問題:

    添加全局斷點.png

    全局斷點的目的就是當產生異常崩潰可以停留在異常或者崩潰發生的地方而不是跳轉到主函數

崩潰斷點.png


可是添加全局斷點後會跳轉到主函數, 會遇到如上圖的狀況, 那麼80%的問題就是storyboard或者xib拖線沒有及時清理掉壞線以下圖:佈局


拖線沒有清除.png


這條Button的連線在代碼中已經刪除了不用了, 可是沒有及時清理掉,因此會形成崩潰!優化

3.NSString使用stringWithFormat拼接的相關知識
  • 保留2位小數點
    //.2表明小數點後面保留2位(2表明保留的數量) NSString *string = [NSString stringWithFormat:@"%.2f",M_PI]; //輸出結果是: 3.14 NSLog(@"%@", string);
  • 0補全的方法
    NSInteger count = 5; //02表明:若是count不足2位 用0在最前面補全(2表明總輸出的個數) NSString *string = [NSString stringWithFormat:@"%02zd",count]; //輸出結果是: 05 NSLog(@"%@", string);
  • 字符串中有特殊符號%怎麼辦
    NSInteger count = 50; //%是一個特殊符號 若是在NSString中用到%須要以下寫法 NSString *string = [NSString stringWithFormat:@"%zd%%",count]; //輸出結果是: 50% NSLog(@"%@", string);
  • 字符串中有特殊符號"怎麼辦
    NSInteger count = 50; //"是一個特殊符號, 若是在NSString中用到"須要用\進行轉義 NSString *string = [NSString stringWithFormat:@"%zd\"",count]; //輸出結果是: 50" NSLog(@"%@", string);
4.判斷是否爲gif/png圖片的正確姿式

首先咱們先想一想若是是你, 你會怎麼去判斷一個從網絡獲取的圖片URL是否爲gif圖片, 是不是這樣呢 ? 以下:網站

//假設這是一個網絡獲取的URL NSString *path = @"http://pic3.nipic.com/20090709/2893198_075124038_2.gif"; // 判斷是否爲gif NSString *extensionName = path.pathExtension; if ([extensionName.lowercaseString isEqualToString:@"gif"]) { //是gif圖片 } else { //不是gif圖片 }

什麼難道你不是這麼判斷的麼 ? 哦~ 我懂了, 難道你使用字符串截取來判斷的嗎 ? 哈哈開個玩笑!
以上判斷看似是能夠的,可是這不嚴謹的, 在不知道圖片擴展名的狀況下, 如何知道圖片的真實類型 ? 其實就是取出圖片數據的第一個字節, 就能夠判斷出圖片的真實類型那該怎麼作呢以下:ui

//經過圖片Data數據第一個字節 來獲取圖片擴展名 - (NSString *)contentTypeForImageData:(NSData *)data { uint8_t c; [data getBytes:&c length:1]; switch (c) { case 0xFF: return @"jpeg"; case 0x89: return @"png"; case 0x47: return @"gif"; case 0x49: case 0x4D: return @"tiff"; case 0x52: if ([data length] < 12) { return nil; } NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { return @"webp"; } return nil; } return nil; }

其實圖片數據的第一個字節是固定的,一種類型的圖片第一個字節就是它的標識, 咱們來調用一下這個方法:spa

//假設這是一個網絡獲取的URL NSString *path = @"http://pic.rpgsky.net/images/2016/07/26/3508cde5f0d29243c7d2ecbd6b9a30f1.png"; NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]]; //調用獲取圖片擴展名 NSString *string = [self contentTypeForImageData:data]; //輸出結果爲 png NSLog(@"%@",string);
5.Button禁止觸摸事件的2種方式

你們應該知道, 有不少需求是在規定內不容許點擊Button, 而且讓用戶知道這個按鈕是不能夠點擊的,那咱們應該這樣設置:.net

//會改變按鈕的狀態,顏色會變灰 button.enabled = NO;

可是又有一個需求是既不能點擊也不要改變Button顏色:scala

//保持按鈕原來的狀態,顏色不會變 button.userInteractionEnabled = NO;
6.跟xib一塊兒走過的坑

(1) 若是在xib中有一個控件, 已經明確設置尺寸了,輸出的frame也是對的, 可是顯示出來的效果不同(好比尺寸變大了), 若是是這種狀況通常就是autoresizingMask自動伸縮屬性在搞鬼! 解決辦法以下:

//xib的awakeFromNib方法中設置UIViewAutoresizingNone進行清空 - (void)awakeFromNib { self.autoresizingMask = UIViewAutoresizingNone; }

(2)若是你的控制器的view是用xib建立的, 當你拿到view的尺寸是不許確的, 在這裏咱們就須要經過[UIScreen mainScreen].bounds拿到尺寸, 可是storyboard的尺寸是準確的!

7.你是用什麼方法設置圖片圓角?

首先你是不是這麼設置的:

//cornerRadius 設置爲self.iconImage圖片寬度的一半(圓形圖片) self.iconImage.layer.cornerRadius = 20; self.iconImage.layer.masksToBounds = YES;

或者是在xib&storyboard中點擊要設置圓角的圖片:


xib或者storyboard設置圓角.png

在此以後建議你們儘可能不要這麼設置, 由於使用圖層過量會有卡頓現象, 特別是弄圓角或者陰影會很卡, 若是設置圖片圓角咱們通常用繪圖來作:

/** 設置圓形圖片(放到分類中使用) */ - (UIImage *)cutCircleImage { UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0); // 獲取上下文 CGContextRef ctr = UIGraphicsGetCurrentContext(); // 設置圓形 CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); CGContextAddEllipseInRect(ctr, rect); // 裁剪 CGContextClip(ctr); // 將圖片畫上去 [self drawInRect:rect]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }

這個方法就是設置圓角圖片, 效率很高, 不會形成卡頓現象, 你們要把這個方法單獨放到分類中使用

8. ## 與 @# 在宏裏面該怎樣使用
  • ##的使用, 首先咱們添加一個宏

    #define LRWeakSelf(type) __weak typeof(type) weak##type = type;

    ##是鏈接的做用, 即當使用上面的宏會把weak與輸入的type值鏈接起來以下圖:


    ## 的使用.png
  • #的意思是緊跟着它的後面的標識符添加一個雙引號""

  • @#的使用, 咱們添加一個普通的宏:
    //隨便寫一個宏 #define LRToast(str) [NSString stringWithFormat:@"%@",str] //這個宏須要這樣寫 LRToast(@"舒適提示"); NSLog(@"%@",LRToast(@"舒適提示"));
    強調下我只是隨便定義一個宏來作示例, 以上代碼是正常的使用,咱們在來看看添加@#是怎麼使用的:
    //隨便寫一個宏 #define LRToast(str) [NSString stringWithFormat:@"%@",@#str] //這個宏須要這樣寫 LRToast(舒適提示); //正常運行, 打印不會報錯 NSLog(@"%@",LRToast(舒適提示));
    咱們能夠看出來 LRToast(舒適提示);LRToast(@"舒適提示");區別, 也就是說@#能夠代替@"" 那麼咱們之後開發就省事了, 不用再添加@""了!
9.自動佈局Autolayout口訣

storyboard或者xib使用自動佈局, 若是控件比較多並且佈局複雜, 一不當心就會報一大堆錯誤警告, 那麼這個口訣是必備良藥, 跟着這個口訣走不再用懼怕Autolayout恐懼症了 !


Autolayout.png


按照如上圖從上到下順序讀就是當前這條約束的狀態, 在xibConstantMultiplier不用區分順序問題, 經過網友(落水雨辰)的提醒, 若是在代碼中須要先MultiplierConstant(蘋果官方的解釋):
First Item(登陸按鈕的頂部)Relation(等於) Second Item(父類View的頂部) Multiplier(乘以 1) Constant(加上 10)

10.App迭代開發版本號的規則

在iOS中簡單的版本號是怎樣管理的呢? 首先咱們的App初版本首次上線, 好比以1.0.0爲首次上線的版本號:

1.上線後忽然發現一個嚴重的Bug那咱們就要修復更新版本, 此時咱們的版本號爲1.0.1
因此說若是修復Bug或者優化功能, 咱們只修改疊加第三位數字, 其餘不變

2.若是有了新的需求, 在原來的基礎上增長了一個新功能, 那麼咱們的版本號變爲1.1.0, 須要清空第三位數字爲0, 來疊加修改第二位數字

3.若是App需求功能大改, 更新量很是大, 那咱們的版本號變爲2.0.0, 須要疊加修改第一位數字, 清空其餘數字爲0

相關文章
相關標籤/搜索