前言
小夥伴們在開發中難免會遇到問題, 你是如何解決問題的?不妨也分享給大家!如果此文章其中的任何一條問題對大家有幫助,那麼它的存在是有意義的! 反正不管怎樣遇到問題就要去解決問題, 在解決問題的同時也是提高開發經驗的渠道!
1.既然有問題我們該怎樣解決 ?
首先大部分人都會去百度搜尋來解決問題, 誰都不例外, 可是百度這東西會有很多誤解, 甚至誤人子弟, 同時解決問題的效率也不是很高, 如果是技術問題可以去:
Google
簡單來說比百度搜尋的答案相對要多,要更準確效率更高, 建議使用英文搜尋Stack Overflow
一個與程式相關的IT技術問答網站, 簡單來說工作中的70%
問題在這裡都能解決
搜尋是解決問題的一種辦法, 那麼剩餘30%
的問題還是需要自己獨立去解決, 那麼有人會問有沒有能提高獨立解決問題的辦法呢 ? 比如: 積累所遇到的崩潰資訊, 學會檢視崩潰資訊, 檢視官方文件的技巧等等) 本文暫時不會詳解, 有時間的話需要單獨寫一篇文章來探究如何高效的解決崩潰問題!
2.用斷點除錯崩潰問題的小技巧
- (1)如果當前斷點指向記憶體, 那麼就是初始化時分配記憶體時有問題
- (2)新增全域性斷點的問題:
全域性斷點的目的就是當產生
異常
或崩潰
能夠停留在異常
或者崩潰
發生的地方而不是跳轉到主函式
但是新增全域性斷點後會跳轉到主函式, 會遇到如上圖的情況, 那麼80%
的問題就是storyboard
或者xib
拖線沒有及時清理掉壞線
如下圖:
這條Button
的連線在程式碼中已經刪除了不用了, 但是沒有及時清理掉,所以會造成崩潰
!
3.NSString使用stringWithFormat拼接的相關知識
- 保留
2
位小數點
1234//.2代表小數點後面保留2位(2代表保留的數量)NSString *string = [NSString stringWithFormat:@"%.2f",M_PI];//輸出結果是: 3.14NSLog(@"%@", string); - 用
0
補全的方法
12345NSInteger count = 5;//02代表:如果count不足2位 用0在最前面補全(2代表總輸出的個數)NSString *string = [NSString stringWithFormat:@"%02zd",count];//輸出結果是: 05NSLog(@"%@", string); - 字串中有特殊符號
%
怎麼辦
12345NSInteger count = 50;//%是一個特殊符號 如果在NSString中用到%需要如下寫法NSString *string = [NSString stringWithFormat:@"%zd%%",count];//輸出結果是: 50%NSLog(@"%@", string); - 字串中有特殊符號
"
怎麼辦
12345NSInteger count = 50;//"是一個特殊符號, 如果在NSString中用到"需要用\進行轉義NSString *string = [NSString stringWithFormat:@"%zd\"",count];//輸出結果是: 50"NSLog(@"%@", string);
4.判斷是否為gif/png圖片的正確姿勢
首先我們先想想如果是你, 你會怎麼去判斷一個從網路獲取的圖片URL
是否為gif
圖片, 是否是這樣呢 ? 如下:
1 2 3 4 5 6 7 8 9 |
//假設這是一個網路獲取的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圖片 } |
什麼難道你不是這麼判斷的麼 ? 哦~ 我懂了, 難道你使用字串擷取來判斷的嗎 ? 哈哈開個玩笑!
以上判斷看似是可以的,但是這不嚴謹的, 在不知道圖片副檔名的情況下, 如何知道圖片的真實型別 ? 其實就是取出圖片資料的第一個位元組, 就可以判斷出圖片的真實型別
那該怎麼做呢如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//通過圖片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; } |
其實圖片資料的第一個位元組是固定的,一種型別的圖片第一個位元組就是它的標識, 我們來呼叫一下這個方法:
1 2 3 4 5 6 7 |
//假設這是一個網路獲取的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, 並且讓使用者知道這個按鈕是不可以點選的,那我們應該這樣設定:
1 2 |
//會改變按鈕的狀態,顏色會變灰 button.enabled = NO; |
但是又有一個需求是既不能點選也不要改變Button顏色:
1 2 |
//保持按鈕原來的狀態,顏色不會變 button.userInteractionEnabled = NO; |
6.跟xib一起走過的坑
(1) 如果在xib
中有一個控制元件, 已經明確設定尺寸了,輸出的frame
也是對的, 但是顯示出來的效果不一樣(比如尺寸變大了), 如果是這種情況一般就是autoresizingMask
自動伸縮屬性在搞鬼! 解決辦法如下:
1 2 3 4 |
//xib的awakeFromNib方法中設定UIViewAutoresizingNone進行清空 - (void)awakeFromNib { self.autoresizingMask = UIViewAutoresizingNone; } |
(2)如果你的控制器的view
是用xib
建立的, 當你拿到view
的尺寸是不準確的, 在這裡我們就需要通過[UIScreen mainScreen].bounds
拿到尺寸, 但是storyboard
的尺寸是準確的!
7.你是用什麼方法設定圖片圓角?
首先你是否是這麼設定的:
1 2 3 |
//cornerRadius 設定為self.iconImage圖片寬度的一半(圓形圖片) self.iconImage.layer.cornerRadius = 20; self.iconImage.layer.masksToBounds = YES; |
或者是在xib
&storyboard
中點選要設定圓角的圖片:
在此之後建議大家儘量不要這麼設定, 因為使用圖層
過量會有卡頓現象, 特別是弄圓角或者陰影會很卡, 如果設定圖片圓角我們一般用繪圖
來做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** 設定圓形圖片(放到分類中使用) */ - (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. ## 與 @# 在巨集裡面該怎樣使用
##
的使用, 首先我們新增一個巨集
1#define LRWeakSelf(type) __weak typeof(type) weak##type = type;
##
是連線的作用, 即當使用上面的巨集會把weak
與輸入的type
值連線起來如下圖:#
的意思是緊跟著它的後面的識別符號新增一個雙引號""
@#
的使用, 我們新增一個普通的巨集:
12345//隨便寫一個巨集#define LRToast(str) [NSString stringWithFormat:@"%@",str]//這個巨集需要這樣寫LRToast(@"溫馨提示");NSLog(@"%@",LRToast(@"溫馨提示"));
強調下我只是隨便定義一個巨集來做示例, 以上程式碼是正常的使用,我們在來看看新增@#
是怎麼使用的:
123456//隨便寫一個巨集#define LRToast(str) [NSString stringWithFormat:@"%@",@#str]//這個巨集需要這樣寫LRToast(溫馨提示);//正常執行, 列印不會報錯NSLog(@"%@",LRToast(溫馨提示));
我們可以看出來LRToast(溫馨提示);
與LRToast(@"溫馨提示");
區別, 也就是說@#
可以代替@""
那麼我們以後開發就省事了, 不用再新增@""
了!
9.自動佈局Autolayout口訣
在storyboard
或者xib
使用自動佈局, 如果控制元件比較多而且佈局複雜, 一不小心就會報一大堆錯誤警告, 那麼這個口訣是必備良藥, 跟著這個口訣走再也不用害怕Autolayout
恐懼症了 !
按照如上圖從上到下順序讀就是當前這條約束的狀態
First Item
(登入按鈕的頂部)Relation
(等於) Second Item
(父類View的頂部) Constant
(加上 10) Multiplier
(乘以 1)
10.App迭代開發版本號的規則
在iOS中簡單的版本號是怎樣管理的呢? 首先我們的App
第一版本首次上線, 比如以1.0.0
為首次上線的版本號:
1.上線後突然發現一個嚴重的Bug
那我們就要修復更新版本, 此時我們的版本號為1.0.1
所以說如果修復Bug
或者優化功能, 我們只修改疊加第三位數字, 其他不變
2.如果有了新的需求, 在原來的基礎上增加了一個新功能, 那麼我們的版本號變為1.1.0
, 需要清空第三位數字為0
, 來疊加修改第二位數字
3.如果App
需求功能大改, 更新量非常大, 那我們的版本號變為2.0.0
, 需要疊加修改第一位數字, 清空其他數字為0
喜歡的小夥伴請點贊一下吧!如果有不足的地方,請大家及時幫忙糾正與補充,順便談談你的建議!