iOS 開(kāi)發(fā)中你是否遇到這些經(jīng)驗(yàn)問(wèn)題(一)

前言

小伙伴們?cè)陂_(kāi)發(fā)中難免會(huì)遇到問(wèn)題, 你是如何解決問(wèn)題的?不妨也分享給大家被碗!如果此文章其中的任何一條問(wèn)題對(duì)大家有幫助藻肄,那么它的存在是有意義的木柬! 反正不管怎樣遇到問(wèn)題就要去解決問(wèn)題, 在解決問(wèn)題的同時(shí)也是提高開(kāi)發(fā)經(jīng)驗(yàn)的渠道!

1.既然有問(wèn)題我們?cè)撛鯓咏鉀Q ?

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

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

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

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

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

崩潰斷點(diǎn).png

但是添加全局?jǐn)帱c(diǎn)后會(huì)跳轉(zhuǎn)到主函數(shù), 會(huì)遇到如上圖的情況, 那么80%的問(wèn)題就是storyboard或者xib拖線(xiàn)沒(méi)有及時(shí)清理掉壞線(xiàn)如下圖:
拖線(xiàn)沒(méi)有清除.png

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

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

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

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

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

//通過(guò)圖片Data數(shù)據(jù)第一個(gè)字節(jié) 來(lái)獲取圖片擴(kuò)展名
- (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í)圖片數(shù)據(jù)的第一個(gè)字節(jié)是固定的,一種類(lèi)型的圖片第一個(gè)字節(jié)就是它的標(biāo)識(shí), 我們來(lái)調(diào)用一下這個(gè)方法:

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

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

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

但是又有一個(gè)需求是既不能點(diǎn)擊也不要改變Button顏色:

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

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

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

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

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

首先你是否是這么設(shè)置的:

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

或者是在xib&storyboard中點(diǎn)擊要設(shè)置圓角的圖片:

xib或者storyboard設(shè)置圓角.png

在此之后建議大家盡量不要這么設(shè)置, 因?yàn)槭褂?code>圖層過(guò)量會(huì)有卡頓現(xiàn)象, 特別是弄圓角或者陰影會(huì)很卡, 如果設(shè)置圖片圓角我們一般用繪圖來(lái)做:

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

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

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

##是連接的作用, 即當(dāng)使用上面的宏會(huì)把weak與輸入的type值連接起來(lái)如下圖:

## 的使用.png

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

強(qiáng)調(diào)下我只是隨便定義一個(gè)宏來(lái)做示例, 以上代碼是正常的使用,我們?cè)趤?lái)看看添加@#是怎么使用的:

 //隨便寫(xiě)一個(gè)宏
    #define LRToast(str) [NSString stringWithFormat:@"%@",@#str]
    //這個(gè)宏需要這樣寫(xiě)
    LRToast(溫馨提示);
    //正常運(yùn)行, 打印不會(huì)報(bào)錯(cuò)
    NSLog(@"%@",LRToast(溫馨提示));

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

9.自動(dòng)布局Autolayout口訣

storyboard或者xib使用自動(dòng)布局, 如果控件比較多而且布局復(fù)雜, 一不小心就會(huì)報(bào)一大堆錯(cuò)誤警告, 那么這個(gè)口訣是必備良藥, 跟著這個(gè)口訣走再也不用害怕Autolayout恐懼癥了 !

Autolayout.png

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

10.App迭代開(kāi)發(fā)版本號(hào)的規(guī)則

在iOS中簡(jiǎn)單的版本號(hào)是怎樣管理的呢? 首先我們的App第一版本首次上線(xiàn), 比如以1.0.0為首次上線(xiàn)的版本號(hào):

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

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

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

喜歡的小伙伴請(qǐng)點(diǎn)贊一下吧!如果有不足的地方疏之,請(qǐng)大家及時(shí)幫忙糾正與補(bǔ)充殿雪,順便談?wù)勀愕慕ㄗh!
相關(guān)文章: iOS開(kāi)發(fā)中你是否遇到這些經(jīng)驗(yàn)問(wèn)題(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锋爪,一起剝皮案震驚了整個(gè)濱河市丙曙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌其骄,老刑警劉巖亏镰,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拯爽,居然都是意外死亡索抓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)毯炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逼肯,“玉大人,你說(shuō)我怎么就攤上這事桃煎±捍保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵为迈,是天一觀的道長(zhǎng)洲拇。 經(jīng)常有香客問(wèn)我奈揍,道長(zhǎng),這世上最難降的妖魔是什么赋续? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮另患,結(jié)果婚禮上纽乱,老公的妹妹穿的比我還像新娘。我一直安慰自己昆箕,他們只是感情好鸦列,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鹏倘,像睡著了一般薯嗤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纤泵,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天骆姐,我揣著相機(jī)與錄音,去河邊找鬼捏题。 笑死玻褪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的公荧。 我是一名探鬼主播带射,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼循狰!你這毒婦竟也來(lái)了窟社?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绪钥,失蹤者是張志新(化名)和其女友劉穎灿里,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昧识,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钠四,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跪楞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀去。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甸祭,靈堂內(nèi)的尸體忽然破棺而出缕碎,到底是詐尸還是另有隱情,我是刑警寧澤池户,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布咏雌,位于F島的核電站凡怎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赊抖。R本人自食惡果不足惜统倒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氛雪。 院中可真熱鬧房匆,春花似錦、人聲如沸报亩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弦追。三九已至岳链,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劲件,已是汗流浹背掸哑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寇仓,地道東北人举户。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遍烦,于是被迫代替她去往敵國(guó)和親俭嘁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,631評(píng)論 1 9
  • 前言 小伙伴們?cè)陂_(kāi)發(fā)中難免會(huì)遇到問(wèn)題, 你是如何解決問(wèn)題的服猪?不妨也分享給大家供填!如果此文章其中的任何一條問(wèn)題對(duì)大家有...
    愛(ài)鬧的凡閱讀 249評(píng)論 0 0
  • Google的目標(biāo)管理方法:Google的每個(gè)員工每個(gè)季度都需要給自己定一個(gè)或者幾個(gè)目標(biāo)Objective,以及衡...
    007小王子閱讀 528評(píng)論 1 0
  • 有一天走在路上罢猪,我聽(tīng)到了兩個(gè)陌生姑娘的對(duì)話(huà)近她。 扎馬尾辮的姑娘說(shuō),我跟你講哦膳帕,昨晚我和我男朋友吵了一架粘捎。 戴眼鏡的姑...
    王九禾閱讀 2,640評(píng)論 24 21
  • 春?jiǎn)⑼曅殊欤刍ㄐξ2省涞嗨驮苣ァO闹帘∫螺p弄,雙扇交汤徽、遮蟌滿(mǎn)袖娩缰。酌酒逐月度秋夕,數(shù)載彈指過(guò)谒府。又是春色璁瓏拼坎,往事亦涳...
    燈暗閱讀 249評(píng)論 0 0