iOS 開發(fā)中你是否遇到這些經(jīng)驗問題(一)

前言

小伙伴們在開發(fā)中難免會遇到問題, 你是如何解決問題的?不妨也分享給大家!如果此文章其中的任何一條問題對大家有幫助,那么它的存在是有意義的! 反正不管怎樣遇到問題就要去解決問題, 在解決問題的同時也是提高開發(fā)經(jīng)驗的渠道!

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

首先大部分人都會去百度搜索來解決問題, 誰都不例外, 可是百度這東西會有很多誤解, 甚至誤人子弟, 同時解決問題的效率也不是很高, 如果是技術(shù)問題可以去:

  • Google 簡單來說比百度搜索的答案相對要多,要更準確效率更高, 建議使用英文搜索
  • Stack Overflow 一個與程序相關(guān)的IT技術(shù)問答網(wǎng)站, 簡單來說工作中的70%問題在這里都能解決

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

2.用斷點調(diào)試崩潰問題的小技巧
  • (1)如果當前斷點指向內(nèi)存, 那么就是初始化時分配內(nèi)存時有問題
  • (2)添加全局斷點的問題:
    添加全局斷點.png

    全局斷點的目的就是當產(chǎn)生異常崩潰能夠停留在異常或者崩潰發(fā)生的地方而不是跳轉(zhuǎn)到主函數(shù)

崩潰斷點.png

但是添加全局斷點后會跳轉(zhuǎn)到主函數(shù), 會遇到如上圖的情況, 那么80%的問題就是storyboard或者xib拖線沒有及時清理掉壞線如下圖:
拖線沒有清除.png

這條Button的連線在代碼中已經(jīng)刪除了不用了, 但是沒有及時清理掉,所以會造成崩潰!

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

首先我們先想想如果是你, 你會怎么去判斷一個從網(wǎng)絡獲取的圖片URL是否為gif圖片, 是否是這樣呢 ? 如下:

  //假設這是一個網(wǎng)絡獲取的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圖片
   }

什么難道你不是這么判斷的么 ? 哦~ 我懂了, 難道你使用字符串截取來判斷的嗎 ? 哈哈開個玩笑!
以上判斷看似是可以的,但是這不嚴謹?shù)? 在不知道圖片擴展名的情況下, 如何知道圖片的真實類型 ? 其實就是取出圖片數(shù)據(jù)的第一個字節(jié), 就可以判斷出圖片的真實類型那該怎么做呢如下:

//通過圖片Data數(shù)據(jù)第一個字節(jié) 來獲取圖片擴展名
- (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;
}

其實圖片數(shù)據(jù)的第一個字節(jié)是固定的,一種類型的圖片第一個字節(jié)就是它的標識, 我們來調(diào)用一下這個方法:

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

大家應該知道, 有很多需求是在規(guī)定內(nèi)不允許點擊Button, 并且讓用戶知道這個按鈕是不可以點擊的,那我們應該這樣設置:

//會改變按鈕的狀態(tài),顏色會變灰
button.enabled = NO;

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

//保持按鈕原來的狀態(tài),顏色不會變
button.userInteractionEnabled = NO;
6.跟xib一起走過的坑

(1) 如果在xib中有一個控件, 已經(jīng)明確設置尺寸了,輸出的frame也是對的, 但是顯示出來的效果不一樣(比如尺寸變大了), 如果是這種情況一般就是autoresizingMask自動伸縮屬性在搞鬼! 解決辦法如下:

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

(2)如果你的控制器的view是用xib創(chuàng)建的, 當你拿到view的尺寸是不準確的, 在這里我們就需要通過[UIScreen mainScreen].bounds拿到尺寸, 但是storyboard的尺寸是準確的!

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

首先你是否是這么設置的:

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

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

xib或者storyboard設置圓角.png

在此之后建議大家盡量不要這么設置, 因為使用圖層過量會有卡頓現(xiàn)象, 特別是弄圓角或者陰影會很卡, 如果設置圖片圓角我們一般用繪圖來做:

/** 設置圓形圖片(放到分類中使用) */
- (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;
}

這個方法就是設置圓角圖片, 效率很高, 不會造成卡頓現(xiàn)象, 大家要把這個方法單獨放到分類中使用

8. ## 與 @# 在宏里面該怎樣使用
  • ##的使用, 首先我們添加一個宏
#define LRWeakSelf(type)  __weak typeof(type) weak##type = type;

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

## 的使用.png

  • #的意思是緊跟著它的后面的標識符添加一個雙引號""
  • @#的使用, 我們添加一個普通的宏:
 //隨便寫一個宏
  #define LRToast(str) [NSString stringWithFormat:@"%@",str]
  //這個宏需要這樣寫
  LRToast(@"溫馨提示");
  NSLog(@"%@",LRToast(@"溫馨提示"));

強調(diào)下我只是隨便定義一個宏來做示例, 以上代碼是正常的使用,我們在來看看添加@#是怎么使用的:

 //隨便寫一個宏
    #define LRToast(str) [NSString stringWithFormat:@"%@",@#str]
    //這個宏需要這樣寫
    LRToast(溫馨提示);
    //正常運行, 打印不會報錯
    NSLog(@"%@",LRToast(溫馨提示));

我們可以看出來 LRToast(溫馨提示);LRToast(@"溫馨提示");區(qū)別, 也就是說@#可以代替@"" 那么我們以后開發(fā)就省事了, 不用再添加@""了!

9.自動布局Autolayout口訣

storyboard或者xib使用自動布局, 如果控件比較多而且布局復雜, 一不小心就會報一大堆錯誤警告, 那么這個口訣是必備良藥, 跟著這個口訣走再也不用害怕Autolayout恐懼癥了 !

Autolayout.png

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

10.App迭代開發(fā)版本號的規(guī)則

在iOS中簡單的版本號是怎樣管理的呢? 首先我們的App第一版本首次上線, 比如以1.0.0為首次上線的版本號:

1.上線后突然發(fā)現(xiàn)一個嚴重的Bug那我們就要修復更新版本, 此時我們的版本號為1.0.1
所以說如果修復Bug或者優(yōu)化功能, 我們只修改疊加第三位數(shù)字, 其他不變

2.如果有了新的需求, 在原來的基礎(chǔ)上增加了一個新功能, 那么我們的版本號變?yōu)?code>1.1.0, 需要清空第三位數(shù)字為0, 來疊加修改第二位數(shù)字

3.如果App需求功能大改, 更新量非常大, 那我們的版本號變?yōu)?code>2.0.0, 需要疊加修改第一位數(shù)字, 清空其他數(shù)字為0

喜歡的小伙伴請點贊一下吧!如果有不足的地方,請大家及時幫忙糾正與補充,順便談談你的建議!
相關(guān)文章: iOS開發(fā)中你是否遇到這些經(jīng)驗問題(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,987評論 1 9
  • 前言 小伙伴們在開發(fā)中難免會遇到問題, 你是如何解決問題的?不妨也分享給大家!如果此文章其中的任何一條問題對大家有...
    愛鬧的凡閱讀 338評論 0 0
  • Google的目標管理方法:Google的每個員工每個季度都需要給自己定一個或者幾個目標Objective,以及衡...
    007小王子閱讀 591評論 1 0
  • 有一天走在路上,我聽到了兩個陌生姑娘的對話。 扎馬尾辮的姑娘說,我跟你講哦,昨晚我和我男朋友吵了一架。 戴眼鏡的姑...
    王九禾閱讀 2,753評論 24 21
  • 春啟童聲惺忪,折花笑、撲蝶相送。夏至薄衣輕弄,雙扇交、遮蟌滿袖。酌酒逐月度秋夕,數(shù)載彈指過。又是春色璁瓏,往事亦涳...
    燈暗閱讀 331評論 0 0

友情鏈接更多精彩內(nèi)容