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

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

1.既然有問題我們?cè)撛鯓咏鉀Q呢。

首先我們大部分人都會(huì)去使用百度搜索來解決問題,誰都不例外,可是百度里面會(huì)產(chǎn)生其他的解決方法,會(huì)使很多人產(chǎn)生誤解。這樣的解決效率不是很高。如果是結(jié)束問題可以去:

  • Google 簡(jiǎn)單來說比百度搜索的答案相對(duì)而言要多,要更加的準(zhǔn)確,效率更高。如果你英語很好的話,建議使用英文搜索。
  • Stack Overflow 一個(gè)與程序相關(guān)的IT技術(shù)問答網(wǎng)站,簡(jiǎn)單來說工作中的70%問題在這里都能夠得到解決。
    搜索是解決問題的一種方法,那么剩余的30%的問題還是需要自己獨(dú)立的去解決,那么就會(huì)有人去詢問有沒有能夠提高獨(dú)立解決問題的辦法呢?(比如:積累所遇到的崩潰信息,學(xué)會(huì)查看崩潰信息,查看官方文檔的技巧等等)。
2.使用斷點(diǎn)調(diào)試崩潰問題的小技巧

(1)如果當(dāng)前斷點(diǎn)只想內(nèi)存,那么就是初始化時(shí)分配內(nèi)存時(shí)有問題
(2)添加全局?jǐn)帱c(diǎn)的問題

全局?jǐn)帱c(diǎn).png

使用全局?jǐn)帱c(diǎn)的目的就是當(dāng)產(chǎn)生異?;蛘弑罎⒛軌蛲A粼诋惓;虮罎l(fā)生的地方,而不是跳轉(zhuǎn)到主函數(shù)

跳轉(zhuǎn)到主函數(shù).png

如果說在添加了全局?jǐn)帱c(diǎn)后依然會(huì)跳轉(zhuǎn)到主函數(shù),會(huì)遇到如上圖的情況,那么80%問題就是在使用可視化(storyboard或者xib)拖線沒有及時(shí)清理掉壞線如下圖所示

沒有徹底清除拖線.png

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

3.NSString使用stringWithFormat拼接的相關(guān)知識(shí)
  • 保留2位小數(shù)點(diǎn)
//.2代表小數(shù)后面保留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中用到%需要如下寫法
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圖片
}

以上片段看似是可以的,但是這不夠嚴(yán)謹(jǐn),在不知道圖片擴(kuò)展名的情況下,如何知道圖片的真實(shí)類型?其實(shí)就是取出圖片數(shù)據(jù)的第一個(gè)字節(jié),就可以判斷出圖片的真實(shí)類型。但是該怎樣操作呢

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

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

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

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

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

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

button.userInteractionEnabled = NO;
6.跟xib一起走過的坑

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

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

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

7。你是用什么方法設(shè)置圖片圓角?
//cornerRadius 設(shè)置為self.iconImage圖片寬度的一半(圓形圖片)
self.iconImage.layer.cornerRadius = 20;
self.iconImage.layer.maskToBounds = YES;

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


可視化.png

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

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

}

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

8.##與@#在宏里面怎樣使用

的使用,首先我們添加一個(gè)宏。

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

##是連接作用,即當(dāng)使用上面的宏會(huì)把weak與輸出的type值連接起來如下圖所示。

#的意思是緊跟著它的后面的標(biāo)識(shí)符添加一個(gè)雙引號(hào)""
@#的使用,我們添加一個(gè)普通的宏

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

強(qiáng)調(diào)下我只是隨便定義一個(gè)宏來做示例,以上代碼是正常的使用,我們?cè)趤砜纯刺砑覢#是怎么使用的.

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

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

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

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

按照上圖從上而下順序讀就是當(dāng)前這條約束的狀態(tài)
First item(登錄按鈕的頂部)Relation(等于) Second item(父類View的頂部)Constant(加上10)Multiplier(乘以1)

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

在iOS中簡(jiǎn)單的版本號(hào)是怎樣管理的呢?首先我們的App第一版本首次上線比如1.0.0位首次上線的版本號(hào):
1)上線后突然發(fā)現(xiàn)一個(gè)嚴(yán)重的Bug那我們就需要修復(fù)更新版本,此時(shí)我們的版本號(hào)為1.0.1
所以說如果修復(fù)Bug或者優(yōu)化功能,我們只修改疊加第三個(gè)數(shù)字,其他不變
2)如果有了新的需求,在原來的基礎(chǔ)上增加一個(gè)新功能,那么我們的版本號(hào)變位機(jī)1.1.0,需要清空第三位數(shù)字為0.來疊加修改第二位數(shù)字
3)如果APP需求功能大改,更新量非常大,那我們的版本號(hào)變?yōu)?.0.0,需要疊加修改第一個(gè)數(shù)字,清空其他數(shù)字為0.

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

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

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