iOS在開發中常見的問題(一)

程序員在開發的過程當中,會遇到各種各樣的問題。那么你又是如何解決問題的呢?在這里分享給大家一些解決問題的渠道,希望能夠有所幫助。

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);
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圖片
}

以上片段看似是可以的,但是這不夠嚴謹,在不知道圖片擴展名的情況下,如何知道圖片的真實類型?其實就是取出圖片數據的第一個字節,就可以判斷出圖片的真實類型。但是該怎樣操作呢

//通過圖片Data數據第一個字節來獲取圖片擴展名
- (NSString *)contentTypeForImageData:(NSData *)data{
uint8_t c;
[data getBytes:&c length:1];
switch(c){
case 0xFF;
  return @"jpeg";
case 0x89;
  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:NSASIIStringEncoding];
   if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]){
       return @"webp";
   }
   return nil;
  }
 return nil;
}

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

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

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

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

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

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.maskToBounds = YES;

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


可視化.png

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

//設置圓形圖片(放到分類中使用)
- (UIImage *)cutCricleImage {
  UIGraphicsBeginImageContextWithOptions(self.size,NO,0.0);
//獲取上下文
CGContextRef ctr = CGRectMake(0,0,self.size.width,self,s.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值連接起來如下圖所示。

#的意思是緊跟著它的后面的標識符添加一個雙引號""
@#的使用,我們添加一個普通的宏

//隨便寫一個宏
#define LRToast(str) [NSString stringWithFormat :"%@",str]
//這個宏需要這樣寫
LRToast(@"溫馨提示“”);
NSLog(@"%@",LRToast(@"溫馨提示"));

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

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

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

9.自動布局Autolayout口訣

在stotyboard或者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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容